-1

JavaでXMLファイルを読み取る必要があります。以下のようなファイル構造。

<?xml version="1.0" encoding="UTF-8"?>
<xml_tool xmlns:md="http://www.example.com/XT/1.0/">
    <md:header>
        <md:application_version>1.0</md:application_version>
        <md:export_date>19-04-2012</md:export_date>
        <md:export_time>14:55</md:export_time>
        <md:export_user>USER01</md:export_user>
    </md:header>
    <md:table table_name="CUSTOMER" key="customer number" record_count="2" column_count="5">
        <md:record>
            <md:column name="customer_number">123456</md:column>
            <md:column name="reg_date">01-04-2012</md:column>
            <md:column name="customer_name">Test Customer</md:column>
            <md:column name="customer_type">Normal </md:column>
            <md:column name="comments">This is a test record</md:column>
        </md:record>
        <md:record>
            <md:column name="customer_number">555111</md:column>
            <md:column name="reg_date">02-04-2012</md:column>
            <md:column name="customer_name">Test Customer</md:column>
            <md:column name="customer_type">VIP </md:column>
            <md:column name="comments">This is a test record</md:column>
        </md:record>
    </md:table>
</xml_tool>

JavaでXMLファイルを読み取る方法–(DOMパーサー)の例を読み、作業を試みました。しかし、XMLファイルを正常に読み取ることができません。

私のコード

    try {

        File fXmlFile = new File("c:\\file.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();

        NodeList nList = doc.getElementsByTagName("md:record");

        for (int i = 0; i < nList.getLength(); i++) {

            Node node = nList.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) node;

                System.out.println(getTagValue("md:column", eElement));


            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 private static String getTagValue(String sTag, Element eElement) {
        NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

            Node nValue = (Node) nlList.item(0);

        return nValue.getNodeValue();
      }

結果は

123456
555111

このXMLファイルをどのように読み取ることができますか?

4

2 に答える 2

4

forループを更新します...

for (int i = 0; i < nList.getLength(); i++)
{
      Node node = nList.item(i);
      if (node.getNodeType() == Node.ELEMENT_NODE)
      {                 
             if(eElement.hasChildNodes())
             {
                 NodeList nl = node.getChildNodes();
                 for(int j=0; j<nl.getLength(); j++)
                 {
                     Node nd = nl.item(j);
                     System.out.println(nd.getTextContent());
                 }
             }
       }
} 
于 2012-04-25T07:16:58.290 に答える
1

現在、非常に不正確なクエリを実行しています(つまり、getElementsByTagName(...)これは第1レベルの子孫に制限されていません)。では、すべての子のすべてのデータを取得するためにgetTagValue(...)、を反復処理する必要があります。NodeListこの場合、メソッドがを返すことを意図している可能性がありますList<String>。または、さらに良いことNodeListに、それを他のメソッドに移動して、そこでループします。

ヘッダーを含むすべてのデータを取得するには、ルートノードから始めて、すべての要素を再帰的に反復する必要があります。

そうは言っても、はるかに良い方法があります。JAXBを使用して、XMLスキーマをPOJO(プレーンオールドJavaオブジェクト)データモデルにバインドできます。その後、すべてのロードが自動的に行われ、プログラムロジックに集中できます。

于 2012-04-25T07:21:53.207 に答える