当前位置: 首页 > 面试题库 >

使用Java DOM获取XML节点文本值

申屠昆
2023-03-14
问题内容

我无法获取文本值Node.getNodeValue()Node.getFirstChild().getNodeValue()或者用Node.getTextContent()

我的XML就像

<add job="351">
    <tag>foobar</tag>
    <tag>foobar2</tag>
</add>

而且我正在尝试获取 标签 值(非文本元素提取工作正常)。我的Java代码听起来像

Document doc = db.parse(new File(args[0]));
Node n = doc.getFirstChild();
NodeList nl = n.getChildNodes();   
Node an,an2;

for (int i=0; i < nl.getLength(); i++) {
    an = nl.item(i);

    if(an.getNodeType()==Node.ELEMENT_NODE) {
        NodeList nl2 = an.getChildNodes();

        for(int i2=0; i2<nl2.getLength(); i2++) {
            an2 = nl2.item(i2);

            // DEBUG PRINTS
            System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):");

            if(an2.hasChildNodes())
                System.out.println(an2.getFirstChild().getTextContent());

            if(an2.hasChildNodes())
                System.out.println(an2.getFirstChild().getNodeValue());

            System.out.println(an2.getTextContent());
            System.out.println(an2.getNodeValue());
        }
    }
}

打印出来

tag type (1): 
tag1
tag1
tag1
null
#text type (3):
_blank line_
_blank line_
...

谢谢您的帮助。


问题答案:

我还将打印出结果an2.getNodeName()以用于调试。我的猜测是您的树爬网代码没有爬到您认为是的节点上。由于没有检查代码中的节点名称,这种怀疑得到了加强。

除此之外,Node的javadoc定义“
getNodeValue()”以为Element类型的Node返回null。因此,您确实应该使用getTextContent()。我不确定为什么不给您想要的文字。

也许迭代标签节点的子节点,看看那里有什么类型?

尝试了这段代码,它对我有用:

String xml = "<add job=\"351\">\n" +
             "    <tag>foobar</tag>\n" +
             "    <tag>foobar2</tag>\n" +
             "</add>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
ByteArrayInputStream bis = new ByteArrayInputStream(xml.getBytes());
Document doc = db.parse(bis);
Node n = doc.getFirstChild();
NodeList nl = n.getChildNodes();
Node an,an2;

for (int i=0; i < nl.getLength(); i++) {
    an = nl.item(i);
    if(an.getNodeType()==Node.ELEMENT_NODE) {
        NodeList nl2 = an.getChildNodes();

        for(int i2=0; i2<nl2.getLength(); i2++) {
            an2 = nl2.item(i2);
            // DEBUG PRINTS
            System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):");
            if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getTextContent());
            if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getNodeValue());
            System.out.println(an2.getTextContent());
            System.out.println(an2.getNodeValue());
        }
    }
}

输出为:

#text: type (3): foobar foobar
#text: type (3): foobar2 foobar2


 类似资料:
  • 在本章中,将学习如何获取XML DOM对象的节点值。 XML文档具有称为节点的信息单元的层次结构。 对象有一个属性 - ,它返回元素的值。 在以下部分中,将讨论学习 - 获取元素的节点值 获取节点的属性值 以下所有示例中使用的node.xml如下所示 - 1. 获取节点值 使用方法以文档顺序返回具有给定标记名称的所有元素的。 示例 以下示例(getnode example.html)将XML文档(

  • 问题内容: 我有一段这样的HTML: 我有一个与此HTML匹配的WebElement。如何从中仅提取“标题”?方法.getText()返回“ Title \ nAuthor”。 问题答案: 您无法在WebDriver API中执行此操作,而必须在代码中执行。例如: 请注意,结尾的换行符实际上是元素文本的一部分,因此,如果您不想要它,则需要将其删除。

  • 我有以下(很大= 我有一个文件,它定义了我要提取的字段及其路径: 因此,HotelName的路径是:。 现在我想了解每家酒店的信息。我无法为它们创建类(如这里),因为脚本必须是动态的,并且将传递具有不同定义文件的不同XML文件。 我如何通过使用路径来解决这个问题,没有类,内存使用率低(= //编辑:一切都已实现。我只需要一种方法来遍历酒店,并使用我拥有的路径获取它们的值。

  • 问题内容: 我有一个看起来像这样的xml: 在这里,我想检索类型为属性的“源类型”的值。 我曾这样尝试过,但无法正常工作: 我也尝试过这个: 请帮助我!! 在此先感谢Varsha。 问题答案: 由于您的问题较为笼统,请尝试使用Java中提供的XML解析器来实现。如果您特定于解析器,请在此处更新您尝试过的代码

  • 我不知道这是如何可能的编程新我想打印值,在abc.txt中存在,但不知道如何做到这一点,使用节点js 预期输出:

  • 问题内容: 我希望获得“我是文本节点”,不希望删除“ edit”标签,并且需要跨浏览器解决方案。 问题答案: 这将获取所选元素的,然后对其应用过滤功能。过滤器功能仅返回文本节点(即带有的节点)。