2013-09-30 2 views
0

Я смотрел через StackOverflow, но я не могу найти лучший ответ. Мне нужно прочитать XML-файл в JAVA. Мой файл XML выглядит следующим образом: `Чтение внутреннего XML элемента XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<server> 
    <server01> 
     <department>A1</department> 
     <department>A2</department> 
    </server01> 
    <server02> 
     <department>A1</department> 
     <department>A2</department> 
    </server02> 
</server> 

Есть ли Possiblity читать в Java элементов между <server01> и <server02>, за исключением остальной части файла? Или мне нужно использовать разные теги? Я нашел способ, как читать parentnodes:

NodeList serversNames = xmlD.getDocumentElement().getChildNodes(); 

for (int i = 0; i < serversNames.getLength(); i++) { 
    Node node = serversNames.item(i); 
    if (node instanceof Element) { 
     Element childElement = (Element) node; 
     System.out.println("tag name: " + childElement.getTagName()); 
    } 
} 

Я могу прочитать все департаменты теги и сохранить их в массиве:

NodeList serverName = xmlD.getElementsByTagName("department"); 

serversList = new String[serverName.getLength()]; 

System.out.println("zasieg: " + serverName.getLength()); 

for (int temp = 0; temp < serverName.getLength(); temp++) { 
    Element shareName = null; 

    shareName = (Element) serverName.item(temp); 

    serversList[temp] = shareName.getTextContent(); 
    System.out.println(temp + " - " + serversList[temp]); 
} 

Итак, опять же, есть возможность чтения элементов родительского узла только? Элементы только SERVER01?

+0

ты говоришь, вы хотите прекратить чтение документа после того, как вы прочитали содержимое и поэтому не читать содержание ? Я думаю, вам нужно определить эту логику в вашей программе, она не будет частью какого-либо анализатора XML. –

+1

Непонятно, что вы пытаетесь сделать или что проблема. Разве вы не можете использовать XPath или эквивалент? Если вы используете управляемый событиями парсер, вы можете остановиться, когда захотите, если это действительно того стоит. –

+0

вы можете использовать xstream для преобразования в XML объекта и объекта в XML, его очень простой способ преобразования XML в объект и объект в XML. – Sarma

ответ

3

XPath - это то, что вы хотите. Для всех целей и целей вы можете думать о xpath, как и sql, только для XML-документов вместо баз данных. Вот простой пример использования Java (имейте в виду XPath является стандартным и не специфична для Java, так что вы можете найти много способов сделать это в значительной степени любой популярный язык):

// Load document 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(new FileInputStream("/tmp/xml")); 

    // Create XPath expression 
    XPathFactory xPathfactory = XPathFactory.newInstance(); 
    XPath xpath = xPathfactory.newXPath(); 
    XPathExpression expr = xpath.compile("//server01"); 

    // Find node 'server01' 
    Node node = (Node) expr.evaluate(doc, XPathConstants.NODE); 
    if(node == null) { 
     System.out.println("Node not found"); 
     System.exit(0); 
    } 

    // Extract departments 
    Element server01 = (Element) node; 
    for(int k = 0 ; k < server01.getChildNodes().getLength() ; k++) { 
     Node childNode = server01.getChildNodes().item(k); 
     // Check if current node is a department node 
     if("department".equals(childNode.getNodeName())) { 
      System.out.println(childNode.getNodeName() + ": " + childNode.getTextContent().trim()); 
     } 
    } 

ли есть возможность избежать этого?

Да, просто измените выражение XPath и получите только те узлы, которые вам нужны.

// Load document 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document doc = builder.parse(new FileInputStream("/tmp/xml")); 

// Create XPath expression 
XPathFactory xPathfactory = XPathFactory.newInstance(); 
XPath xpath = xPathfactory.newXPath(); 
XPathExpression expr = xpath.compile("//server01/department"); 

// Find nodes 'department' under node 'server01' 
NodeList node = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 

// Extract departments 
for(int k = 0 ; k < node.getLength() ; k++) { 
    Node childNode = node.item(k); 
    // Check if current node is a department node 
    if("department".equals(childNode.getNodeName())) { 
     System.out.println("[" + k + "] " + childNode.getNodeName() + ": " + childNode.getTextContent().trim()); 
    } 
} 

Вы должны получить следующий вывод:

[0] department: A1 
[1] department: A2 
+0

Привет, извините, я случайно отредактировал ваш ответ – Dave

+0

Чтобы гарантировать, что я не беру от вас очки в результате моих изменений, Я удалил свой ответ и дал вам преимущество, так как у нас в основном был тот же ответ. – Dave

+0

Привет. Это первое простое решение. Я не удивлен, что я был не один :) – Nicolai

Смежные вопросы