1

次の種類の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>

持っている名前の値に基づいてnode="Item"から詳細を抽出するにはどうすればよいですか?また、この目的で標準のjava dom xmlを使用するか、他のxmlパーサーライブラリを使用する方がよいでしょうか。

4

4 に答える 4

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

于 2012-12-07T12:41:24.163 に答える
1

標準のJavaのみを使用する場合は、XPathが最適です。

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
}
于 2012-12-07T12:58:49.093 に答える
1

StAXをお勧めします。これを試してください(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を参照してください。理由がわかります。

于 2012-12-07T13:05:39.890 に答える
0

たぶんXPathを使用しますか?

Document dom = ...;
XPath xpath = XPathFactory.newInstance().newXPath();
String result = xpath.evaluate("/eSummaryResult/DocSum/Item[@Name='Title']", dom);
于 2012-12-07T12:45:57.213 に答える