2012-12-07 132 views
1

我有以下類型的XML文件,如何使用java從xml文件中提取詳細信息?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE eSummaryResult PUBLIC "-//NLM//DTD eSummaryResult, 29 October 2004//EN" "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eSummary_041029.dtd"> 
<eSummaryResult> 
<DocSum> 
    <Id>224589801</Id> 
    <Item Name="Caption" Type="String">NC_000010</Item> 
    <Item Name="Title" Type="String">Homo sapiens chromosome 10, GRCh37.p10 Primary Assembly</Item> 
    <Item Name="Extra" Type="String">gi|224589801|gnl|ASM:GCF_000001305|10|ref|NC_000010.10||gpp|GPC_000000034.1||gnl|NCBI_GENOMES|10[224589801]</Item> 
    <Item Name="Gi" Type="Integer">224589801</Item> 
    <Item Name="CreateDate" Type="String">2002/08/29</Item> 
    <Item Name="UpdateDate" Type="String">2012/10/30</Item> 
    <Item Name="Flags" Type="Integer">544</Item> 
    <Item Name="TaxId" Type="Integer">9606</Item> 
    <Item Name="Length" Type="Integer">135534747</Item> 
    <Item Name="Status" Type="String">live</Item> 
    <Item Name="ReplacedBy" Type="String"/> 
    <Item Name="Comment" Type="String"><![CDATA[ ]]></Item> 
</DocSum> 

</eSummaryResult> 

如何提取節點=「項目」基於它的名稱爲價值的細節?爲了達到這個目的,使用標準的java dom xml或更好的方式來使用任何其他的xml解析器庫也是好的嗎?

回答

1

,試試這個(javax.xml.stream *)

XMLInputFactory f = XMLInputFactory.newInstance(); 
    XMLStreamReader rdr = f.createXMLStreamReader(new FileReader("test.xml")); 
    while (rdr.hasNext()) { 
     if (rdr.next() == XMLStreamConstants.START_ELEMENT) { 
      if (rdr.getLocalName().equals("Item")) { 
       System.out.println(rdr.getAttributeValue("", "Name")); 
       System.out.println(rdr.getElementText()); 
      } 
     } 
    } 

的StAX必須始終是首先要考慮的事情。見http://en.wikipedia.org/wiki/StAX你會知道爲什麼

1

試試下面的代碼

/* Create a Document object (doc) from the xml */ 
NodeList list = doc.getElementsByTagName("Item"); 

for(int i=0;i<list.getLength();i++) 
{ 
    Node node = list.item(i); 
    NamedNodeMap namedNodeMap = node.getAttributes(); 
    if(namedNodeMap.getNamedItem("Name").getTextContent().equalsIgnoreCase("Caption")) 
    { 
     System.out.println(node.getTextContent()); 
    } 
} 

輸出應該NC_000010

0

也許使用XPath?

Document dom = ...; 
XPath xpath = XPathFactory.newInstance().newXPath(); 
String result = xpath.evaluate("/eSummaryResult/DocSum/Item[@Name='Title']", dom); 
1

如果僅僅使用標準的Java,XPath是要走的路:我建議StAX的

private URL xml = getClass().getResource("/example.xml"); 

@Test 
public void testExamples() throws Exception { 
    //assertEquals("NC_000010", extractUsingDom("Caption")); 
    assertEquals("NC_000010", extractUsingXPath("Caption")); 
} 

public String extractUsingXPath(final String name) throws XPathExpressionException, IOException { 
    // XPathFactory class is not thread-safe so we do not store it 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    return xpath.evaluate(
     String.format("/eSummaryResult/DocSum/Item[@Name='%s']", name), // xpath expression 
     new InputSource(xml.openStream()));        // the XML Document 
} 
相關問題