2012-02-08 4 views
2
<a> 
    <b> 
     <c type="lol"> 
      <d>1</d> 
      <f>2</f> 
     </c> 
     <c type="lol"> 
      <d>2</d> 
      <f>2</f> 
     </c> 
     <c type="h"> 
      <d>v</d> 
      <f>d</f> 
     </c> 
    </b> 
</a> 

 Как можно получить нодлист дочернего узла, используя xpath dom java?

DocumentBuilderFactory dBFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dB = dBFactory.newDocumentBuilder(); 
Document doc = dB.parse(url);  
System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 

как можно это получить нодлист детского узла т.е. мне нужно, чтобы получить дочерние узлы «б» (нодлисте, который имеет 3 «с» узлами) ..

+0

возможный дубликат [запроса Java Xpath] (http://stackoverflow.com/questions/9109428/java-xpath-query) –

ответ

3

Вы можете использовать jOOX, а затем написать

List<Element> elements = $(doc).find("b").children().get(); 

Или с DOM:

// Beware, this list also contains the blank text nodes around the <c/> elements, 
// if your document is formatted. 
NodeList list = doc.getElementsByTagName("b").item(0).getChildNodes(); 

ОБНОВЛЕНИЕ: Если вы хотите продолжить перемещение вашего документа DOM (т. получить дочерние узлы "c", как вы упоминаете в комментариях, то я очень рекомендую jOOX:

// This will find all "c" elements, and then return all children thereof 
$(doc).find("c").children(); 

// This will return "d", "f", "d", "f", "d", "f": 
List<String> tags = $(doc).find("c").children().tags(); 

// This will return "1", "2", "2, "2", "v", "d": 
List<String> texts = $(doc).find("c").children().texts(); 

Проделав то же самое с DOM будет довольно громоздким:

List<Element> elements = new ArrayList<Element>(); 
List<String> tags = new ArrayList<String>(); 
List<String> texts = new ArrayList<String>(); 

NodeList c = doc.getElementsByTagName("c"); 
for (int i = 0; i < c.getLength(); i++) { 
    if (c.item(i) instanceof Element) { 
    NodeList children = c.item(i).getChildNodes(); 

    for (int j = 0; j < children.getLength(); j++) { 
     if (children.item(j) instanceof Element) { 
     elements.add((Element) children.item(j)); 
     tags.add(((Element) children.item(j)).getTagName()); 
     texts.add(children.item(j).getTextContent()); 
     } 
    } 
    } 
} 

UPDATE 2 (пожалуйста, более конкретный с будущими вопросами ...): с помощью XPath, сделайте следующее:

XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression expression = xpath.compile("//c/*"); 
NodeList nodes = (NodeList) expression.evaluate(
    document.getDocumentElement(), XPathConstants.NODESET); 
+0

предположим, что я хотите дочерние узлы «c»? Извините, у меня есть сложный xml, где мне нужно получить дочерние узлы, большой нод-лист для детей (у ребенка есть дочерний элемент и его дочерний нодлист) ... код помогает, и я могу сказать doc.getElementsByTagName («c»). Item (0) .getchildnode(); –

+0

@tharanidharan: См. Обновленный ответ –

+0

Спасибо за ответ, но мне нужно его с помощью xpath только .... я 70% сделал с моим кодом .. с очень мало времени осталось, я не могу пойти на новый подход .. –

0

Вот пример использования XPath

String xmlSource = "<a>" + 
        "<b>" + 
         "<c type='lol'>" + 
          "<d>1</d>" + 
          "<f>2</f>" + 
         "</c>" + 
         "<c type='lol'>" + 
          "<d>2</d>" + 
          "<f>2</f>" + 
         "</c>" + 
         "<c type='h'>" + 
          "<d>v</d>" + 
          "<f>d</f>" + 
         "</c>" + 
        "</b>" + 
       "</a>"; 

XPath xPath = XPathFactory.newInstance().newXPath(); 
String expression = "https://stackoverflow.com/a/b/c"; 

InputSource inputSource = new InputSource(new StringReader(xmlSource));    
NodeList nodes = (NodeList) xPath.evaluate(expression, inputSource, XPathConstants.NODESET); 

for(int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getAttributes().getNamedItem("type").getNodeValue());  
} 

Вам нужно будет импортировать следующий

import java.io.StringReader; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource;