DOM解析器错误的childNodes计数

时间:2015-06-19 14:04:06

标签: java xml dom xsd jms

这很奇怪,但让我尽力把它放在一起。

我有一个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推送给两个子节点。
  • 所以我现在有了一个新的ELEMENT NODE,它有两个孩子。因为我现在不需要现有的元素节点,它们仍然是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>

由于

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

&#34;输出XML&#34;下的文件;表示发件人方面有问题。我的猜测是,inp不是String,但是某种对象和setText(inp)不会调用inp.toString(),而是触发某种序列化代码它会产生你正在看到的奇怪的XML。