当前位置: 首页 > 知识库问答 >
问题:

DOM解析器错误的子节点计数

杜君浩
2023-03-14

这很奇怪,但让我尽力把它说清楚。

我有一个XML,我正在以普通方式从桌面读取,并通过DOM解析器对其进行解析。

<?xml version="1.0" encoding="UTF-8"?>
<Abase
    xmlns="www.abc.com/Events/Abase.xsd">
    <FVer>0</FVer>
    <DV>abc App</DV>
    <DP>abc Wallet</DP>
    <Dversion>11</Dversion>
    <sigID>Ss22</sigID>
    <activity>Adding New cake</activity>
</Abase>

读取XML以获取childs。

Document doc = docBuilder.parse("C://Users//Desktop//abc.xml");
Node root = doc.getElementsByTagName("Abase").item(0);
NodeList listOfNodes = root.getChildNodes();            //Sysout Prints 13

所以这里我的逻辑运行良好。当我尝试将相同的XML推送到队列并读取它并获取子节点时,它给我的子节点数是6。

Document doc=docBuilder.parse(new InputSource(new ByteArrayInputStream(msg.getBytes("UTF-8"))));
Node root = doc.getElementsByTagName("Abase").item(0);
NodeList listOfNodes = root.getChildNodes();            //Sysout Prints 6

这打乱了我解析XML的逻辑。有人能帮我吗?

更新

添加发送逻辑:

javax.jms.TextMessage tmsg = session.createTextMessage();
tmsg.setText(inp);
sender.send(tmsg);

问题如果我从桌面读取这个xml,它说13个孩子,6个元素节点和7个文本nodes.TheCommon Logic是:

  • 读取所有子项并遍历子项列表
  • 如果节点不是文本节点,则进入If块,添加一个父元素和两个子元素,并附加到现有根元素。然后在元素节点之间获取NodeName和GetTextContext,并分别将它们作为两个子节点的setTextContext推送
  • 所以我现在有了一个新的元素节点,它有两个子节点。由于我现在不需要已经存在的元素节点(它们仍然是根的子节点),最后我删除了它们

因此,如果我将XML推送到队列并将其分区以执行相同的逻辑,则上述逻辑都是错误的。

输出XML,当我从桌面读取时,它很好,但是从队列中读取有问题,因为它搞砸了整个树。

<Abase
    xmlns="www.abc.com/Events/Abase.xsd">
<Prop>
<propName>FVer</propName>
<propName>0</propName> //similarly for other nodes
</Prop>
</Abase>

谢谢

共有2个答案

裴昊阳
2023-03-14

“输出XML”下的文档意味着发送方有问题。我的猜测是inp不是String,而是某种对象,并且setText(inp)不调用inp.toString(),而是触发某种序列化代码,从而产生您看到的这种奇怪的XML。

葛鸿熙
2023-03-14

如果包含空白文本节点,则有13个子节点,但如果删除空白文本节点,则只有6个子节点。因此,在这两种情况下,树的构建方式有所不同,这会影响空白文本节点是否被保留。

 类似资料:
  • 我正在尝试解析一个XML文档,但由于某种原因,我无法从任何东西中获取任何子节点。我已经厌倦了我所知道的一切。我最初尝试使用Dom4J,但在命名空间方面遇到了重大困难。现在我正在尝试使用标准DOM解析器。 我已经阅读了oracle教程以及其他教程,但没有看到任何关于为什么我最基本的功能失败的建议。 我将首先分享我的代码: 所以简单地说,我想做的就是返回根节点(即“文档”)的子节点。)有一个应该返回的

  • 问题内容: 我正在使用此库(PHP简单HTML DOM解析器)来解析链接,这是代码: 但是在输出结果时出现此错误: 致命错误:在第25行的/var/www/vhosts/efamous.de/subdomains/sandbox/httpdocs/getNewTrusts.php中的非对象上调用成员函数find() (第25行是foreach循环),奇怪的是它(至少在表面上)正确地输出了所有内容,

  • 问题内容: 当我尝试从http://api-v3.deezer.com/1.0/search/album/?q=beethoven&index=2&nb_items=2&output=json使用以下方法获取JSON 时: 我得到: 但是使用http://search.twitter.com/search.json?q=beethoven&callback=?&count=5的JSON 可以正常工

  • 我一直得到一个JSON解析器错误,每次我尝试连接从Android到php帐户。下面你会看到我得到的错误: 谁能帮帮我吗。。。 PHP代码: Android代码: Android代码: 公共JSONObject getJSONFromUrl(字符串url,列表参数){ 注册用户JSONObject PhP警告: php代码: 链接89是$no_of_rows 用户表结构: mysql_error:

  • 我可以使用以下方法获取第一个

  • 在本章中,我们将学习XML DOM节点。 每个XML DOM都包含称为节点的分层单元信息,DOM描述了这些节点以及它们之间的关系。 节点类型 以下图显示了所有节点类型 - XML中最常见的节点类型是 - 文档节点(Document Node) - 完整的XML文档结构是文档节点。 元素节点(Element Node) - 每个XML元素都是一个元素节点,它也是唯一可以拥有属性的节点类型。 属性节点