【问题标题】:DOM Parser wrong childNodes CountDOM Parser 错误 childNodes Count
【发布时间】:2015-09-05 13:20:34
【问题描述】:

这很奇怪,但让我尽力解决。

我有一个 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 以获取子项。

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 个文本节点。通用逻辑是:

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

因此,如果我将 XML 推送到队列并对其进行分区以执行相同的逻辑,则上述逻辑全都搞砸了。

OUTPUT XML,当我从桌面读取时,它会很好,但是从队列读取有问题,因为它搞砸了完整的树。

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

谢谢

【问题讨论】:

  • "C://Users//Desktop" 是 XML 文件吗?
  • 这些肯定是完全相同的 XML 吗? 13 是问题中漂亮打印的 XML 的正确答案(六个元素节点加上标签周围的七个纯空格文本节点),如果 XML 都在一行上,没有多余的空格,则 6 是正确的。
  • 是的,完全相同的 XML,唯一的区别是一个是从桌面读取,另一个是作为文本消息推送到 JMS 队列,然后作为 ByteArrayInputStream 读取。
  • 或者我怀疑 ByteArrayInputStream 是罪魁祸首??因为当我浏览队列时,我可以看到所有带有元素的文本节点。
  • 尝试调用 normalize() 但没有运气:(

标签: java xml dom xsd jms


【解决方案1】:

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

【讨论】:

  • 好的,当我将 xml 内容推送到队列并读回时,有什么办法可以保留空格。>>我希望再次看到 13 个孩子,这样我的逻辑就可以工作了,因为整棵树都变了,我的逻辑完全失败了。
  • 有什么办法可以确保在两种情况下构建的树应该相同??
  • 很想知道,如何保持 xml 树的相似性。
  • @user3560140 如果您需要这方面的帮助,那么您应该发布代码生成并将 XML 发送到队列。也就是说,我不明白为什么您的解析依赖于空白文本节点。
  • @JBNizet:: 空白文本节点 >> 中间的文本用于创建新元素。整个树结构已更改,因此我无法根据 TextNode 或 ElementNode 的类型对其进行操作。
【解决方案2】:

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

【讨论】:

  • :: inp 是一个字符串,当我在做tmsg.setText(inp); 时,这实际上将一个字符串作为输入,然后我只是使用 sender 类将其推送到队列中,到目前为止一切都很好。但是当我开始从队列中读取相同的 xml 时,真正的问题就开始了,当时它没有考虑空格和文本节点,只考虑元素节点,所以构建的树与我之前推送的队列不同。感谢您的帮助。
  • 在您致电 setText(inp) 之前向我们显示 inp 的值。
  • here is the inp &gt;Thanks for your interest&lt; private static String inp = "" + ""+ " 0"+ "abc 应用程序"+ "abc 钱包"+ "11"+ "Ss22"+ "添加新蛋糕"+ "";
  • 你怎么知道这是输入?你检查了调试器还是“只是”确定?
  • 我没有在调试中检查输入,正在尝试将 xml 作为字符串输入发送,所以这就是我初始化输入字符串的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多