2013-09-30 5 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> 사이의 자바 요소에서 읽을 수 possiblity가 있습니까? 아니면 다른 태그를 사용해야합니까?

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]); 
} 

그래서, 다시 부모 노드의 요소를 읽을 수있는 가능성이 : 나는 모든 부서 태그를 읽고 배열에 저장할 수 있어요

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()); 
    } 
} 

: 나는 parentnodes을 읽을 수있는 방법을 방법 발견 만? SERVER01 요소 만?

+0

당신은 당신이 의 내용을 읽고 너무 의 내용에 읽지 않은 후 문서 읽기를 중단 할 건가요을? 프로그램에서이 논리를 정의해야한다고 생각합니다. 실제로는 XML 파서의 일부가 아닙니다. –

+1

당신이하려는 일이나 이슈가 무엇인지는 명확하지 않습니다. XPath 또는 그와 동등한 것을 사용할 수 있습니까? 이벤트 중심의 파서를 사용하면 정말로 가치가있는 경우 언제든지 중단 할 수 있습니다. –

+0

xstream을 사용하여 XML로 변환하여 객체 및 객체를 XML로 변환 할 수 있습니다. XML을 객체 및 객체로 XML로 변환하는 가장 쉬운 방법입니다. – Sarma

답변

3

XPath가 원하는 것입니다. 모든 의도와 목적을 위해 xpath는 SQL과 마찬가지로 생각할 수 있습니다. 데이터베이스가 아니라 xml 문서에만 해당됩니다. 여기에 자바를 사용하여 간단한 예입니다 (마음 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"); 

    // 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