Answers:
一些有前途的工具:
nokogiri:使用XPath和CSS选择器在ruby中解析HTML / XML DOM
hpricot:已弃用
fxgrep:使用其自己的类似XPath的语法来查询文档。用SML编写,因此安装可能很困难。
LT XML:从SGML工具,包括衍生XML工具箱sggrep
,sgsort
,
xmlnorm
和其他人。使用其自己的查询语法。该文档
非常正式。LT用C写。LT XML 2声称支持XPath,XInclude和其他W3C标准。
xmlgrep2:使用XPath进行简单而强大的搜索。使用XML :: LibXML和libxml2在Perl中编写。
XQSharp:支持XQuery,它是XPath的扩展。为.NET Framework而编写。
xml-coreutils:Laird Breyer的等同于GNU coreutils的工具包。在有关理想工具包应包含的内容的有趣文章中进行了讨论。
xmldiff:比较两个xml文件的简单工具。
xmltk:在debian,ubuntu,fedora或macports中似乎没有软件包,自2007年以来没有发布过,并且使用了非便携式构建自动化。
xml-coreutils似乎是记录最好的文档,也是最面向UNIX的。
在Joseph Holsten的出色列表中,我添加了Perl库XML :: XPath随附的xpath命令行脚本。从XML文件提取信息的好方法:
xpath -q -e '/entry[@xml:lang="fr"]' *xml
-q -e
选项。例如,从“ AndroidManifest.xml”中的“清单”节点获取属性“包装”值:xpath AndroidManifest.xml 'string(/manifest/@package)' 2> /dev/null
也有xml2
和2xml
一对。它将允许普通的字符串编辑工具来处理XML。
例。q.xml:
<?xml version="1.0"?>
<foo>
text
more text
<textnode>ddd</textnode><textnode a="bv">dsss</textnode>
<![CDATA[ asfdasdsa <foo> sdfsdfdsf <bar> ]]>
</foo>
xml2 < q.xml
/foo=
/foo= text
/foo= more text
/foo=
/foo/textnode=ddd
/foo/textnode
/foo/textnode/@a=bv
/foo/textnode=dsss
/foo=
/foo= asfdasdsa <foo> sdfsdfdsf <bar>
/foo=
xml2 < q.xml | grep textnode | sed 's!/foo!/bar/baz!' | 2xml
<bar><baz><textnode>ddd</textnode><textnode a="bv">dsss</textnode></baz></bar>
PS还有html2
/ 2html
。
2xml
可以轻松地从部分(过滤的)xml2
输出中重新创建XML 。
cat foo.xml | xml2 | grep /bar | 2xml
为您提供与原始结构相同的结构,但是除“ bar”元素外,所有元素均已删除。太棒了
您可以使用xmllint:
xmllint --xpath //title books.xml
应该与大多数发行版捆绑在一起,并且也与Cygwin捆绑在一起。
$ xmllint --version
xmllint: using libxml version 20900
看到:
$ xmllint
Usage : xmllint [options] XMLfiles ...
Parse the XML files and output the result of the parsing
--version : display the version of the XML library used
--debug : dump a debug tree of the in-memory document
...
--schematron schema : do validation against a schematron
--sax1: use the old SAX1 interfaces for processing
--sax: do not build a tree but work just at the SAX level
--oldxml10: use XML-1.0 parsing rules before the 5th edition
--xpath expr: evaluate the XPath expression, inply --noout
--xpath
是一个相当新的添加,例如在RHEL 6版本的中xmllint
。
xmllint --xpath
是在libxml2 2.7.7(2010年)中引入的。
如果您正在Windows上寻找解决方案,则Powershell具有用于读取和写入XML的内置功能。
test.xml:
<root>
<one>I like applesauce</one>
<two>You sure bet I do!</two>
</root>
Powershell脚本:
# load XML file into local variable and cast as XML type.
$doc = [xml](Get-Content ./test.xml)
$doc.root.one #echoes "I like applesauce"
$doc.root.one = "Who doesn't like applesauce?" #replace inner text of <one> node
# create new node...
$newNode = $doc.CreateElement("three")
$newNode.set_InnerText("And don't you forget it!")
# ...and position it in the hierarchy
$doc.root.AppendChild($newNode)
# write results to disk
$doc.save("./testNew.xml")
testNew.xml:
<root>
<one>Who likes applesauce?</one>
<two>You sure bet I do!</two>
<three>And don't you forget it!</three>
</root>
来源:https : //serverfault.com/questions/26976/update-xml-from-the-command-line-windows
xps $doc .root.one
xps $doc 'AppendChild("three")'
和,我可能会接受它xps $doc '.three.set_InnerText("And don't you forget it!")'
,这显然是次等的!
还有NetBSD xmltools的xmlsed和xmlgrep!
取决于您要做什么。
XSLT可能是要走的路,但是有一个学习曲线。尝试使用xsltproc并注意可以输入参数。
saxon-lint
从命令行也可以使用XPath 3.0 / XQuery 3.0。(其他命令行工具使用XPath 1.0)。
http / html:
$ saxon-lint --html --xpath 'count(//a)' http://stackoverflow.com/q/91791
328
xml:
$ saxon-lint --xpath '//a[@class="x"]' file.xml
D. Bohdan维护了一个开源GitHub存储库,其中包含用于结构化文本工具的命令行工具列表,其中有一个用于XML / HTML工具的部分:
我首先使用xmlstarlet并仍在使用它。当查询变得困难时,我需要XML的xpath2和xquery功能支持,我转向xidel http://www.videlibri.de/xidel.html
您可以定义一个bash函数,例如包装一些python3代码的“ xp”(“ xpath”)。要使用它,您需要安装python3和python-lxml。好处:
像这样使用既简单又强大:
xmldoc=$(cat <<EOF
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
EOF
)
selection='//*[namespace-uri()="http://www.sample.com/" and local-name()="job" and re:test(.,"^pro.*ing$")]/text()'
echo "$xmldoc" | xp "$selection"
# prints programming
xp()看起来像这样:
xp()
{
local selection="$1";
local xmldoc;
if ! [[ -t 0 ]]; then
read -rd '' xmldoc;
else
xmldoc="$2";
fi;
python3 <(printf '%b' "from lxml.html import tostring\nfrom lxml import etree\nfrom sys import stdin\nregexpNS = \"http://exslt.org/regular-expressions\"\ntree = etree.parse(stdin)\nfor e in tree.xpath('""$selection""', namespaces={'re':regexpNS}):\n if isinstance(e, str):\n print(e)\n else:\n print(tostring(e).decode('UTF-8'))") <<< "$xmldoc"
}
考虑使用xq,它可以为您提供jq“编程语言”的全部功能。如果您安装了python-pip,则可以使用pip install yq安装xq ,然后在以下示例中,我们将“ Keep Accounts”替换为“ Keep Accounts 2”:
xmldoc=$(cat <<'EOF'
<resources>
<string name="app_name">Keep Accounts</string>
<string name="login">"login"</string>
<string name="login_password">"password:"</string>
<string name="login_account_hint">input to login</string>
<string name="login_password_hint">input your password</string>
<string name="login_fail">login failed</string>
</resources>
EOF
)
echo "$xmldoc" | xq '.resources.string = ([.resources.string[]|select(."#text" == "Keep Accounts") ."#text" = "Keep Accounts 2"])' -x