1

次の XML ドキュメントがあります。

<?xml version="1.0" encoding="utf-8"?>
<RootElement>
   <Achild>
      .....
   </Achild>
</RootElement>

Achildドキュメントに要素が含まれているかどうかを確認するにはどうすればよいですか? 私は試した

final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Use the factory to create a builder
try {
    final DocumentBuilder builder = factory.newDocumentBuilder();
    final Document doc = builder.parse(configFile);
    final Node parentNode = doc.getDocumentElement();
    final Element childElement = (Element) parentNode.getFirstChild();
    if(childElement.getNodeName().equalsIgnoreCase(...

しかし、エラーが発生します(childElementis null)。

4

2 に答える 2

1

#textたとえば、ノード(との間のノード<RootElement>)を最初の子として取得していると思います(これは<Achild>かなり一般的な間違いです)。

final Node parentNode = doc.getDocumentElement();
Node childElement = parentNode.getFirstChild();
System.out.println(childElement.getNodeName());

戻り値:

#text

代わりに使用してください:

final Node parentNode = doc.getDocumentElement();
NodeList childElements = parentNode.getChildNodes();
for (int i = 0; i < childElements.getLength(); ++i)
{
    Node childElement = childElements.item(i);
    if (childElement instanceof Element)
        System.out.println(childElement.getNodeName());
}

希望する結果:

Achild

編集:

方法を使用する2番目の方法がありますDocumentBuilderFactory.setIgnoringElementContentWhitespace

factory.setIgnoringElementContentWhitespace(true);

ただし、これは検証モードでのみ機能するため、XMLドキュメントでDTDを指定する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE RootElement [
    <!ELEMENT RootElement (Achild)+>
    <!ELEMENT Achild (#PCDATA)>
]>
<RootElement>
   <Achild>some text</Achild>
</RootElement>

と設定しfactory.setValidating(true)ます。完全な例:

final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
final DocumentBuilder builder = factory.newDocumentBuilder();
final Document doc = builder.parse("input.xml");

final Node rootNode = doc.getDocumentElement();
final Element childElement = (Element) rootNode.getFirstChild();

System.out.println(childElement.getNodeName());

元のコードで必要な結果:

Achild
于 2011-07-11T13:16:44.727 に答える
0

.getFirstChild() が "" と "" の間に空白を含むテキスト ノードを返しているように聞こえます。この場合、期待する場所に到達するには、次の兄弟ノードに進む必要があります。

于 2011-07-11T13:15:09.590 に答える