2013-09-30 77 views
0

我正在通过StackOverflow查找,但找不到最佳答案。我需要在JAVA中读取XML文件。我的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> 

是否有成为了可能,在<server01><server02>之间的Java元素,但不包括文件的其余部分阅读?或者我需要使用不同的标签?我发现方法如何阅读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是你想要的。对于所有的意图和目的,你可以像使用sql一样思考xpath,只能用于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

为了确保我不会因为我的编辑而从你那里得到分数,我已经删除了我的答案,并给你一个upvote,因为我们基本上有相同的答案。 – Dave

+0

嗨。这是第一个简单的解决方案。我并不感到惊讶,我并不孤单:) – Nicolai