测试XML属性

hen*_*dry 22 xpath xmlstarlet

我有一段像这样的XML:

<root>
    <foo src=""/>
    <foo src="bar"/>
    <foo />
</root>
Run Code Online (Sandbox Code Playgroud)

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

我来的最远的是

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

bar
Run Code Online (Sandbox Code Playgroud)

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

Jea*_*ett 31

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

/root/foo[not(@src)]
Run Code Online (Sandbox Code Playgroud)

对于其他两个任务,我会使用@TOUDIdel和@Dimitre Novatchev指出的表达式的混合: /root/foo[@src and string-length(@src)=0]for foos with empty src,/root/foo[@src and string-length(@src)!=0]for foos with srcwith content in it.

顺便说一句,我会避免使用"随处"选择器//(更不用说*通配符),除非你确定这是你需要的.//就像让你非常渴望的狗嗅一块布告诉它一样,"带给我一切闻起来像这样的东西,无论你在哪里找到它".你不会相信它可以决定带回来的怪异废话.


小智 15

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

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

//*[@src[not(string())]]
Run Code Online (Sandbox Code Playgroud)

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

//*[string(@src)]
Run Code Online (Sandbox Code Playgroud)

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

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

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

当且仅当其长度不为零时,字符串才为真.


TOU*_*del 5

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

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


Dim*_*hev 5

用途

//*[@src and not(string-length(@src))]
Run Code Online (Sandbox Code Playgroud)

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

//*[@src and string-length(@src)]
Run Code Online (Sandbox Code Playgroud)

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

//*[@src and string-length(normalize-space(@src))]
Run Code Online (Sandbox Code Playgroud)

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

//[not(@src)]
Run Code Online (Sandbox Code Playgroud)

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