测试XML属性

时间:2011-04-07 11:34:21

标签: xpath xmlstarlet

我有一段像这样的XML:

<root>
    <foo src=""/>
    <foo src="bar"/>
    <foo />
</root>

我想知道哪些元素具有src属性,这些属性为空且具有值。

我来得最远的是

$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml 

bar

虽然这并没有告诉我第三个foo缺少属性。

4 个答案:

答案 0 :(得分:31)

这将选择没有src属性的foos。

/root/foo[not(@src)]

对于其他两个任务,我会使用@TOUDIdel和@Dimitre Novatchev指出的混合表达式:  对于/root/foo[@src and string-length(@src)=0]为空的foos,我为src/root/foo[@src and string-length(@src)!=0]为包含内容src的foos。

顺便说一句,我会避免使用“任意位置”选择器//(更不用说*通配符),除非你确定这是你需要的具体内容。 //就像让你非常渴望的狗嗅一块布告诉它,“把你闻到的所有气味带给我,无论你在哪里找到它”。你不会相信它可以决定带回来的怪异废话。

答案 1 :(得分:14)

  

我想知道哪些元素具有src属性,这些属性为空且具有值。

具有@src属性为空的元素(无字符串值):

//*[@src[not(string())]]

具有@src属性且具有值(字符串值)的元素:

//*[string(@src)]

来自http://www.w3.org/TR/xpath/#section-String-Functions

  

通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串。

来自http://www.w3.org/TR/xpath/#function-boolean

  

当且仅当其长度为非零时,字符串才为真。

答案 2 :(得分:4)

/root/foo[string-length(@src)!=0]返回所有 foo 元素的非空值。

不幸的是/root/foo[string-length(@src)=0]表示没有 src 属性的元素,而且元素的 src 属性也是空的。

答案 3 :(得分:4)

使用

//*[@src and not(string-length(@src))]

这将选择XML文档中具有src属性且字符串值长度为零的所有元素。

//*[@src and string-length(@src)]

这将选择XML文档中具有src属性的所有元素,其中字符串值的长度不为零。

//*[@src and string-length(normalize-space(@src))]

这将选择XML文档中具有src属性的所有元素,其中排除起始和结束空白后的字符串值的长度不为零。

//[not(@src)]

这将选择XML文档中没有src属性的所有元素。