return 树中包含字符串值的所有唯一元素的列表的 XPath
XPath to return a list of all unique elements in tree that contain a string value
我正在尝试设计一些 XPath,它将为我提供树中每个元素的列表,其中包含一些字符串值(任何值,只要它不为空),没有重复项。如果我可以 return 一个列表 object,我可以很容易地从中删除重复项。我正在尝试将一些 XML 序列化为 CSV,这是我能想到的构建 header 行的最佳方式...
谢谢!
决定依靠 Python 并尽可能避免使用 XPath,这很有效:
columns = list(set([x.tag for x in root.iter() if x.text is not None]))
XPath 1.0 解决方案:
name((//*)[i][text()[normalize-space()]]
其中 i
是要增加的值。
XML :
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<year>Giada De Laurentis</year>
<year>2005</year>
<price>euros</price>
</book>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentis</author>
<year>2005</year>
<price>euros</price>
<colorcover>red</colorcover>
</book>
</bookstore>
R代码:
a=list()
i=1
for (j in 1:xpathSApply(p,"count(//*)")) {
xpath=paste0('name((//*)[',i,'][text()[normalize-space()]])')
a[[i]]=xpathSApply(p,xpath)
i=i+1}
a=unlist(unique(a[-which(a=="")]))
输出:
"title" "year" "price" "author" "colorcover"
我正在尝试设计一些 XPath,它将为我提供树中每个元素的列表,其中包含一些字符串值(任何值,只要它不为空),没有重复项。如果我可以 return 一个列表 object,我可以很容易地从中删除重复项。我正在尝试将一些 XML 序列化为 CSV,这是我能想到的构建 header 行的最佳方式...
谢谢!
决定依靠 Python 并尽可能避免使用 XPath,这很有效:
columns = list(set([x.tag for x in root.iter() if x.text is not None]))
XPath 1.0 解决方案:
name((//*)[i][text()[normalize-space()]]
其中 i
是要增加的值。
XML :
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<year>Giada De Laurentis</year>
<year>2005</year>
<price>euros</price>
</book>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentis</author>
<year>2005</year>
<price>euros</price>
<colorcover>red</colorcover>
</book>
</bookstore>
R代码:
a=list()
i=1
for (j in 1:xpathSApply(p,"count(//*)")) {
xpath=paste0('name((//*)[',i,'][text()[normalize-space()]])')
a[[i]]=xpathSApply(p,xpath)
i=i+1}
a=unlist(unique(a[-which(a=="")]))
输出:
"title" "year" "price" "author" "colorcover"