2015-10-02 2 views
0

Привет У меня есть требование, как синтаксический анализ XML и получить все дочерние узлы и есть данные между узлами <Employees> и </Employees>Синтаксический XML, чтобы получить все дочерние узлы и их данные с помощью Java XPATH

У меня есть XML, как:

<?xml version="1.0"?> 
<Employees> 
    <Employee emplid="1111" type="admin"> 
     <firstname>test1</firstname> 
     <lastname>Watson</lastname> 
     <age>30</age> 
     <email>[email protected]</email> 
    </Employee> 
    <Employee emplid="2222" type="admin"> 
     <firstname>Sherlock</firstname> 
     <lastname>Homes</lastname> 
     <age>32</age> 
     <email>[email protected]</email> 
    </Employee> 
</Employees> 

мне нужен ответ, как

<Employee emplid="1111" type="admin"> 
     <firstname>test1</firstname> 
     <lastname>Watson</lastname> 
     <age>30</age> 
     <email>[email protected]</email> 
    </Employee> 
    <Employee emplid="2222" type="admin"> 
     <firstname>Sherlock</firstname> 
     <lastname>Homes</lastname> 
     <age>32</age> 
     <email>[email protected]</email> 
    </Employee> 

Я попытался ниже код

FileInputStream file = new FileInputStream(new File("E:\\test.xml")); 

     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 

     DocumentBuilder builder = builderFactory.newDocumentBuilder(); 

     Document xmlDocument = builder.parse(file); 

     XPath xPath = XPathFactory.newInstance().newXPath(); 

     System.out.println("*************************"); 
     String expression = "/Employees/*"; 
     System.out.println(expression); 
     String email = xPath.compile(expression).evaluate(xmlDocument); 
     System.out.println(email); 

, но я получаю ответ, как

test1 
     Watson 
     30 
     [email protected] 

Я использовал выражение как /сотрудников/* но не работает

может кто-нибудь помочь мне в этом?

+0

Выражение XPath правильно выбрать все дочерние элементы корневого элемента. Однако, чтобы сериализовать узел обратно в строку разметки, вам необходимо использовать DOM Level 3 Load and Save API или трансформатор по умолчанию. –

+0

, так что мы не можем это сделать, используя простой xpath? если у вас есть какой-либо рабочий код, вы можете поделиться им? –

+0

XPath 1.0 и 2.0 не сериализуют узлы, нет, в XPath 3.0 вы можете использовать http://www.w3.org/TR/xpath-functions-30/#func-serialize, например. '/ Employees/*/serialize (.)', Чтобы получить последовательность строк. Но Oracle Java JRE не поддерживает XPath 3.0, и используемый вами API не предназначен для XPath 2.0 или 3.0. –

ответ

0

Это было бы возможно преобразование XSLT:

<xsl:template match="Employees"> 
    <xsl:copy-of select = "Employee" /> 
</xsl:template> 
0

Если вы хотите сериализовать узел DOM в строку использовать, например,

import org.w3c.dom.bootstrap.DOMImplementationRegistry; 
import org.w3c.dom.Document; 
import org.w3c.dom.ls.DOMImplementationLS; 
import org.w3c.dom.ls.LSSerializer; 

... 

DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); 

DOMImplementationLS impl = 
    (DOMImplementationLS)registry.getDOMImplementation("LS"); 

LSSerializer writer = impl.createLSSerializer(); 
String str = writer.writeToString(node); 

Так возвращая NodeList вы могли бы использовать

 String expression = "/Employees/*"; 
    System.out.println(expression); 
    NodeList elements = (NodeList)xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET); 
    for (int i = 0; i < elements.getLength(); i++) 
    { 
     System.out.println(writer.writeToString(element.item(i)); 
    } 
0

Во-первых, если вы хотите, чтобы соответствовать каждому Employee, в идеале ваше выражение XPath должно быть Employee не /Employees/*. Если вы знаете имя тега, вам также не нужен XPath, вы можете просто сделать xmlDocument.getElementsByTagName("Employee").

Если вы хотите сериализовать узел в строку, вы можете использовать Transformer, что-то вроде этого:

Transformer t = TransformerFactory.newTransformer(); 
NodeList nodes = xmlDocument.getElementsByTagName("Employee"); 
for(int i = 0; i < nodes.getLength(); i++) { 
    StringWriter sw = new StringWriter(); 
    t.transform(new DOMSource(nodes.item(i)), new StreamResult(sw)); 
    String serialized = sw.toString(); 
    System.out.println(serialized); 
} 
Смежные вопросы