2011-01-10 7 views
5

Tak mam następujący kod, który jestem prawie skopiowany z here. Ale problem polega na tym, że moje węzły tekstowe nie zawierają żadnego tekstu, który mają po prostu atrybuty. Więc mam jakJak usunąć #text z mojego analizowania węzła w Java xml parsowanie domena

<Random name="Katie" num="5"></Random> 

i używam tego kodu, aby go przetworzyć:

private void listNodes(Node node, String indent) 
    { 
    String nodeName = node.getNodeName(); 
    System.out.println(indent + " Node is: " + nodeName); 

    if(node instanceof Element && node.hasAttributes()) 
    { 
     System.out.println(indent + "Attributes are: "); 
     NamedNodeMap attrs = node.getAttributes(); 
     for (int i = 0; i < attrs.getLength(); i++) 
     { 
     Attr attribute = (Attr) attrs.item(i); 
     System.out.println(indent + attribute.getName() + "=" + attribute.getValue()); 
     } 
    } 

    NodeList list = node.getChildNodes(); 

    if (list.getLength() > 0) 
    { 
     for (int i = 0; i < list.getLength(); i++) 
     { 
     listNodes(list.item(i), indent + " "); 
     } 
    } 
    } 

Z jakiegoś powodu mój pusty tekst węzłów wszyscy mówią

Węzeł jest: #text

Czy ktoś wie, jak pominąć pusty tekst węzła podczas parsowania pliku xml?

Dzięki,

Josh

+0

Można również usunąć wszystkie puste węzły tekstowe: http://stackoverflow.com/a/16285664/1812434 –

Odpowiedz

8

Z walidacji DTD można mieć parser automatycznie tłumią odstępy między elementami. Jednak aby zmodyfikować konkretną implementację, możesz przetestować węzły tekstowe i zignorować je, jeśli są puste.

private void listNodes(Node node, String indent) 
{ 
    if (node instanceof Text) { 
     String value = node.getNodeValue().trim(); 
     if (value.equals("")) { 
      return; 
     } 
    } 

    String nodeName = node.getNodeName(); 
    System.out.println(indent + " Node is: " + nodeName); 
    ... 
+0

Dziękuję za doskonała odpowiedź! – Grammin

5

„#text” jest wynikiem sposobu wywoływania GetNodeName() na pusty node.These pustych węzłów mogą być identyfikowane za pomocą „XPath” i mogą być usunięte.

XPathFactory xpathFactory = XPathFactory.newInstance(); 
// XPath to find empty text nodes. 
XPathExpression xpathExp = xpathFactory.newXPath().compile(
    "//text()[normalize-space(.) = '']"); 
NodeList emptyTextNodes = (NodeList) 
    xpathExp.evaluate(doc, XPathConstants.NODESET); 
// Remove each empty text node from document. 
for (int i = 0; i < emptyTextNodes.getLength(); i++) { 
    Node emptyTextNode = emptyTextNodes.item(i); 
emptyTextNode.getParentNode().removeChild(emptyTextNode); 
} 

"#text" jest generowany w wyniku pustych miejsc.

6

Można również użyć Node.getNodeType() metody do tego celu

Node node; 
if(node.getNodeType == node.ELEMENT_NODE) { 
    //Your code inside this 
}