2015-05-30 31 views
0

我剛接觸java並解析並研究了所有簡單的示例。他們給我的基本知識,但我將如何解析一個更高級的XML文件,如下所示。使用java解析xml與幾個父母

<?xml version="1.0"?> 
<employee name="carlos"> 
    <employment_form works="fulltime"> 
    <employment_number>555</employment_number> 
    <days_worked>200</days_worked> 
    <employment_deps dependencies="started"> 
     <Another_Employee NAME="jenny"/> 
     <Another_Employee NAME="jimmy"/> 
    </employment_deps> 
    <employment_deps dependencies="now"> 
     <Another_Employee NAME="jenny"/> 
     <Another_Employee NAME="jimmy"/> 
     <Another_Employee NAME="lisa"/> 
    </employment_deps> 
    </employment_form> 
    <employment_form works="parttime"> 
    <employment_number>554</employment_number> 
    <days_worked>21</days_worked> 
    <employment_deps dependencies="started"> 
     <Another_Employee NAME="mike"/> 
     <Another_Employee NAME="donny"/> 
     <Another_Employee NAME="fredrik"/> 
    </employment_deps> 
    <employment_deps dependencies="when finished"> 
     <Another_Employee NAME="trish"/> 
     <Another_Employee NAME="carl"/> 
     <Another_Employee NAME="noone"/> 
    </employment_deps> 
    </employment_form> 
    </employee> 

我想顯示每個employment_form的詳細列表;

carlos fulltime 555 200 started 
jenny 
jimmy 
carlos fulltime 555 200 now 
jenny 
jimmy 
lisa 
carlos parttime 554 21 started 
mike 
donny 
fredrik 
carlos parttime 554 21 now 
trish 
carl 
noone 

我希望有人能幫助我,我不知道從哪裏開始。

+1

你可以閱讀[mkyong文章](http://www.mkyong.com/java/how-to-read-xml-file-in -java-SAX解析器/)。它們是用於java的XML解析的有用指南。 – Dracontis

+0

如果你有格式良好的XML,任何Java庫都應該能夠解析它。一個XML文件應該只有* ONE *根元素(例如'employees')。但是,儘管如此,你的文件確實是「格式良好」的:https://validator.w3.org/check。下面是一個很好的教程:[Java和XML](http://www.vogella.com/tutorials/JavaXML/article.html) – paulsm4

+0

U可以使用XStream:http://xstream.codehaus.org/ index.html – Bikku

回答

0

你可以簡單的使用java dom解析器來解析你的xml文檔。

粗例如,以產生期望的結果是

import org.w3c.dom.*; 
import org.xml.sax.SAXException; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import java.io.File; 
import java.io.IOException; 

public class XmlParser { 

    public static void main(String[] args) { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     try { 
      StringBuilder output = new StringBuilder(); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document doc = builder.parse(new File("xmlfile")); 
      Element root = doc.getDocumentElement(); 
      String employeeName = root.getAttribute("name"); 
      NodeList employmentForm = doc.getElementsByTagName("employment_form"); 

      for (int i = 0; i < employmentForm.getLength(); i++) { 
       Node node = employmentForm.item(i); 
       NamedNodeMap attribute = node.getAttributes(); 
       String works = attribute.getNamedItem("works").getNodeValue(); 

       if (node.getNodeType() == Node.ELEMENT_NODE) { 
        Element element = (Element) node; 
        String employeeNumber = element.getElementsByTagName("employment_number").item(0).getTextContent(); 
        String daysWorked = element.getElementsByTagName("days_worked").item(0).getTextContent(); 
        NodeList employmentDeps = element.getElementsByTagName("employment_deps"); 
        String dependencies = employmentDeps.item(0).getAttributes().getNamedItem("dependencies").getNodeValue(); 

        for (int j = 0; j < employmentDeps.getLength(); j++) { 
         output.append(employeeName).append(" ") 
           .append(works).append(" ") 
           .append(employeeNumber).append(" ") 
           .append(daysWorked).append(" ") 
           .append(dependencies).append("\n"); 
         Node anotherEmployee = employmentDeps.item(j); 
         if (anotherEmployee.getNodeType() == Node.ELEMENT_NODE) { 
          Element anotherEmployeeElement = (Element) anotherEmployee; 
          NodeList anotherEmployeeList = anotherEmployeeElement.getElementsByTagName("Another_Employee"); 
          for (int k = 0; k < anotherEmployeeList.getLength(); k++) { 
           Node anotherEmployeeNode = anotherEmployeeList.item(k); 
           if (anotherEmployeeNode.getNodeType() == Node.ELEMENT_NODE) { 
           output.append(anotherEmployeeNode.getAttributes().getNamedItem("NAME").getNodeValue()).append("\n"); 
          } 
         } 

        } 
       } 
      } 
     } 

     System.out.println(output.toString()); 

    } catch (ParserConfigurationException e) { 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    } 
} 
+0

謝謝你,很好的例子!這就是我一直在尋找的東西。我確實已經創建了一個類似的,看起來不像你的。代碼的一個版本是將信息存儲在對象中並創建一個對象數組。只要它看起來不像是狗被拖入的東西,我就會發布我的代碼。 – syso