0

私は次のようなXMLファイルを持っています

<parent>
  <child1>
   <child2>
     <name>name</name>
     <value>
     <item>value></item>
    </value>
  </child2>
 </child1>
  <child1>
   <value>
     <item>value></item>
    </value>
 </child1>
</parent>

ここで、child2 ノードが欠落しているかどうかを確認する必要があります。

私のJavaコードは

File xmlfile = new File ("sample.xml");
DocumentBuilderFactory dbfaFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = dbfaFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(xmlfile);
NodeList child1= doc.getElementsByTagName("child1");
for( int i=0; i<child1.getLength(); i++)
{
NodeList child1= doc.getElementsByTagName("child1");
if(!doc.getElementsByTagName("child2").equals(null))
{
System.out.println("Not Equal to null");

                else
                {
                    System.out.println("Equal to null");
                }
}

しかし、XMLにchild2ノードがないにもかかわらず、毎回Not Equal to nullを取得しています。

ここに child2 がありません

<child1>
   <value>
     <item>value></item>
    </value>
 </child1>

ありがとう。

4

2 に答える 2

1

このコードは機能しません: doc.getElementsByTagName("child2")XML 全体をトラバースします。つまり、見つかったすべての child2 を返します。

を使用してみるかchild1.getElementsByTagName("child2")、「健全な」XML ライブラリの使用を検討してください。たとえば、XOM には、getChildElements(String name)期待どおりに機能する機能があります。

EDIT:Jensonが指摘したように、NullPointerExceptionnullチェック句で s に遭遇する可能性がありますchild1.getElementsByTagName("child2") != null。代わりに使用してください。

于 2012-08-03T12:02:46.960 に答える
0

XPath がこのタスクに適していることがわかるかもしれません。

    try {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        documentBuilderFactory.setNamespaceAware(true);
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document = documentBuilder.parse(new File("sample.xml"));

        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();
        XPathExpression xPathExpression = xPath.compile("/parent/child1/child2");

        NodeList nodeList = (NodeList) xPathExpression.evaluate(document, XPathConstants.NODESET);

        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            System.out.println(node.getNodeName());
        }

child2が存在する場合、 はnodeList.getLength()1 (または のchild2下に存在する要素の数child1) に等しくなり、それ以外の場合は 0 になります。

child1ない子を持つすべてのインスタンスが必要な場合は、child2次を使用できます。

/parent/child1/*[not(self::child2)]

XPath 式として。child1そうでない子を持つ回数だけを数えたい場合はchild2、次を使用できます。

/parent/child1/*[not(self::child2)][1]
于 2012-08-03T12:19:50.303 に答える