【问题标题】:String (with spaces) to DOM in JavaJava中的字符串(带空格)到DOM
【发布时间】:2012-06-12 16:25:52
【问题描述】:

我有一个函数可以将字符串转换为 DOM,然后在 DOM 对象上使用 javax.xml.xpath.XPathFactory 来提取数据。

XPathFactory 适用于以下字符串

<root><test><name>A</name></test><test><name>B</name></test></root>

但如果标签之间有空格,它会失败

<root> <test> <name>A</name> </test> <test> <name>B</name> </test></root>

我正在使用 XpathFactory 来准备来自 DOM 的值“A”和“B”。

当字符串在标签之间有空格时,谁能告诉我为什么 XpathFactory 会失败。

谢谢
--SD

【问题讨论】:

  • 是什么让您认为 XPathFactory 失败了?也许您是想问如何制定正确的 XPath 表达式?
  • @Rambo:是的,如何制定正确的 XPath 表达式(如果输入的 xml 是标签之间有空格的字符串并转换为 DOM)

标签: java xml string dom xpath


【解决方案1】:

XPath 是正确的并且工作正常,我认为问题在于

list.item(i).getChildNodes().item(0).getTextContent());

获取与XPath匹配的节点的第一个子节点,在带有空格的XML的情况下是<employee>之后的空格,而在没有空格的XML的情况下是<name>元素.

换句话说,在有空格的情况下,第一个employee 元素的子节点是(每行一个):

[spaces]
<name> . . . </name>
[spaces]
<company-no> . . . </company-no>
[spaces]
<chunk-id> . . .</chunk-id>

如果没有空格,它们是:

<name> . . . </name>
<company-no> . . . </company-no>
<chunk-id> . . .</chunk-id>

所以在第一种情况下,您需要的子节点是 1、3 和 5,在第二种情况下是 0、1 和 2。

我认为你应该修改这段代码:

 System.out.println("Name: " +list.item(i).getChildNodes().item(0).getTextContent());
 System.out.println("Company: "+list.item(i).getChildNodes().item(1).getTextContent());
 System.out.println("Chunk: "+list.item(i).getChildNodes().item(2).getTextContent());

要么使用其他 XPath 来获取名称、公司和块子节点,要么跳过包含空格的子节点。

【讨论】:

  • 谢谢,你知道builder.parse()是怎么工作的吗?请参阅此处的第 36 行 ideone.com/y5WKx 我相信它将空格/制表符视为 xml 标签并解释它们而不是省略。如果我错了,请纠正我。
  • 我不知道builder.parse() 是如何工作的,但一般来说,XML 解析器应该是这样的:在解析的 XML 中也为空格生成节点——正如我在回答中所写的,你有改变您使用/处理 XPath 结果的方式。
【解决方案2】:
/root/test/name

甚至只是

//name

可选,直接获取子文本节点

//name/text()

【讨论】:

  • 我认为我们在不同的页面上,我写的 XPath 表达式是正确的。问题是字符串 2 中显示的标签之间的空格不会产生正确的结果。虽然没有空格会产生所需的结果。
  • 很抱歉没有早点给出代码。这里你去ideone.com/ocvA1注意输入字符串emp在标签之间有空格,尝试省略这些,你会看到正确的值被打印出来
猜你喜欢
  • 2017-08-29
  • 2021-05-20
  • 1970-01-01
  • 2012-03-06
  • 2018-11-07
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多