我有以下XML:
...<span class="st">In Tim <em>Power</em>: Politieman...</span>...
我想在<span>
标记之间提取部分。
为此,我使用XPath:
/span[@class="st"]
然而,这将提取包括<span>
在内的所有内容。
和
/span[@class="st"]/text()
将返回两个文本元素的列表。一个包含&#34;在Tim&#34;。另一个&#34;:Politieman&#34;。 <em>..</em>
不包括在内,并且像分隔符一样处理。
是否有返回的纯XPath解决方案:
In Tim <em>Power</em>: Politieman...
修改
感谢@helderdarocha和@TextGeek。使用XPath提取纯文本似乎非常简单,只包括<em>
。
/ span [@class =&#34; st&#34;] / node()解决方案创建一个包含各行的列表,在Python中创建一个String很简单。
答案 0 :(得分:5)
要获取任何子节点,您可以使用:
/span[@class="st"]/node()
这将返回:
<em>
节点(元素和内容)。如果您确实需要所有text()
个节点,包括em
内的节点,那么请获取所有text()
个后代:
/span[@class="st"]//text()
或
/span[@class="st"]/descendant::text()
这将返回三个文本节点,文本在 <em>
内,而不是<em>
元素。
答案 1 :(得分:2)
听起来你想要相当于Javascript DOM innerHTML()函数,但对于XML。我不认为在纯XPath中可以做到这一点。
XPath并不真正对标记字符串进行操作,例如&#34;&lt; em&gt;&#34;和&#34;&lt; / em&gt;&#34;根本 - 它与Node对象树一起工作(可能有一个XPath实现试图直接使用标记,但我对此表示怀疑)。大多数XPath实现甚至不会有4个字符&#34;&lt; em&gt;&#34;任何地方(除了可能留下来打印错误消息或其他东西),当然DOM可能是从头开始而不是从XML或其他输入开始构建的。同样,XPath并没有真正意图回复标记的字符串,而是节点列表。
在XSLT或XQuery中,您可以轻松地执行此操作,但不能单独使用XPath,除非我遗漏了某些内容。
-s