有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在使用JDOM解析XML文件时出错

我有这个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(...

但它给了我一个错误(childElement为空)


共 (2) 个答案

  1. # 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
    

    编辑:

    第二种方法是使用^{}方法:

    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
    
  2. # 2 楼答案

    听起来像。getFirstChild()将返回一个文本节点,其中包含“”和“”之间的空白,在这种情况下,您需要前进到下一个同级节点才能到达预期的位置