【发布时间】: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() 但没有运气:(