2016-10-26 4 views
1

мне нужно прочитать файл XML в Java, то XMD документ выглядит следующим образом:Как читать XML-файл в Java без тэгу

<?xml version="1.0" encoding="UTF-8"?> 
    <Provider> 
     <Invoice>256848</Invoice> 
     <InvoiceType>Paper</InvoiceType> 
     <Phone>0554334434</Phone> 
     <InvoiceDate>20091213</InvoiceDate> 
    <CustomerRequest> 
     <Article> 
     <ArticleCode>PE4</ArticleCode> 
     <ArticleDescription>Pen</ArticleDescription> 
     <DeliveryDate>20091231</DeliveryDate> 
     <Price>150</Price> 
     </Article> 
    </CustomerRequest> 
    <CustomerInfo> 
     <CustomerID>6901</CustomerID> 
     <CustomerAddress> Houghton Street</CustomerAddress> 
     <CustomerCity>London</CustomerCity> 
    </CustomerInfo> 

</Provider> 

Проблема заключается в том, что содержание документа может изменяться путем включения другие теги и множество вложенных тегов, которые могут иметь произвольный уровень, есть способ иметь все теги и значения документа динамическим способом без указания имени тега? Благодаря

+1

Да, прочитайте его как документ DOM, и у вас есть все теги и значения. – vanje

+1

Фактически, почти все методы для чтения такого документа (SAX, DOM, другие древовидные модели, такие как JDOM2 и XOM, XPath, XQuery, XSLT) будут работать без предварительного знания словаря. Единственным реальным исключением является JAXB. –

+0

Вы должны пойти для 'DocumentBuilderFactory'. Также для получения дополнительной информации см. Решение 2 из [здесь] (https://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/) –

ответ

3

Из-за этого XML построен в виде дерева, вам нужно использовать рекурсию:

Предположим, что это ваш главный класс:

public static void main(String[] args) throws SAXException, IOException, 
     ParserConfigurationException, TransformerException { 

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory 
     .newInstance(); 
    DocumentBuilder doc = docBuilderFactory.newDocumentBuilder(); 
    Document document = doc.parse(new File("doc.xml")); 
    childRecusrsion(document.getDocumentElement()); 
} 

И это рекурсия:

public static void childRecusrsion(Node node) { 
     // do something with the current node instead of System.out 
     System.out.println(node.getNodeName()); 

     NodeList nodeList = node.getChildNodes(); //gets the child nodes that you need 
     for (int i = 0; i < nodeList.getLength(); i++) { 
      Node currentNode = nodeList.item(i); 
      if (currentNode.getNodeType() == Node.ELEMENT_NODE) { 
       //call the recursion 
       childRecusrsion(currentNode); 
      } 
     } 
    } 
+1

Спасибо, что именно мне было нужно! – Alex2330