Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DOM解析器错误的子节点计数_Java_Xml_Dom_Xsd_Jms - Fatal编程技术网

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

Java DOM解析器错误的子节点计数,java,xml,dom,xsd,jms,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

这很奇怪,但让我尽力解释一下

我有一个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推送到队列并读取它并获取子节点时,它给我的子节点数是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个child、6个元素节点和7个文本节点。常见逻辑是:

  • 读取所有子项并遍历子项列表
  • 如果节点不是文本节点,则进入If块,添加一个父元素和两个子元素,并附加到现有根元素。然后获取元素节点之间的NodeName和TextContext,并将它们分别作为两个子元素的setTextContext推送
  • 所以我现在有了一个新的元素节点,它有两个子节点。由于我现在不需要已经存在的元素节点,它仍然是root的子节点,最后我将删除它们
因此,如果我将XML推到队列中并对其进行分区以执行相同的逻辑,那么上述逻辑就完蛋了

输出XML这在我从桌面读取时很好,但从队列读取有问题,因为它会破坏整个树

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

弗维尔
0//对于其他节点也是如此

谢谢

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

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

是一个XML文件吗?它们肯定是完全相同的XML吗?13是问题中印刷精美的XML的正确答案(六个元素节点加上标记周围的七个纯空白文本节点),6是正确的,如果XML都在一行上,没有多余的空白。是,完全相同的XML唯一的区别是一个从桌面读取,而另一个作为文本消息推送到JMS队列,然后作为ByteArrayInputStream读取。或者我怀疑ByteArrayInputStream是罪魁祸首??因为我在浏览队列时可以看到所有包含元素的文本节点。我尝试调用normalize(),但没有成功:(好的,当我将xml内容推到队列并重新读取时,是否有任何方法可以保留空白。>>我希望再次看到13个孩子,这样我的逻辑就可以工作,因为整个树都改变了,我的逻辑完全失败了。是否有任何方法可以确保在这两种情况下构建的树应该是相同的??好奇地想知道,如何保持xml树的相似性ross@user3560140如果您需要帮助,那么您应该发布生成XML并将其发送到队列的代码。也就是说,我不明白为什么您的解析依赖于空白文本节点。@jbniset::blank text node>>中间的文本用于创建新元素。整个树结构已更改,因此我无法基于此对其进行操作在TextNode或ElementNode的类型上。:
inp
是一个字符串,当我执行
tmsg.setText(inp)时
这实际上需要一个字符串作为输入,然后使用sender类将其推送到队列中,到目前为止一切都很好。但真正的问题始于我开始从队列中读取相同的xml,当时它不考虑空格和文本节点,而只考虑元素节点,因此构建的树与在我之前也推过了队列。谢谢你的帮助。在你调用
setText(inp)
之前向我们展示
inp的值。这里是inp>感谢你的兴趣
私有静态字符串inp=“”+”+“0”+“abc应用程序”+“abc钱包”+“11”+“Ss22”+“添加新蛋糕”+”;您如何知道这是输入?您是签入调试器还是“只是”确定?我没有在调试中检查输入,我正在尝试将xml作为字符串输入发送,因此这就是我初始化输入字符串的方式。
<Abase
    xmlns="www.abc.com/Events/Abase.xsd">
<Prop>
<propName>FVer</propName>
<propName>0</propName> //similarly for other nodes
</Prop>
</Abase>