xmlstarlet 相关问题

XMLStarlet是一组命令行实用程序(工具),可以使用简单的shell命令集来转换,查询,验证和编辑XML文档和文件,就像使用UNIX grep,sed对纯文本文件一样。 awk,diff,patch,join等命令。

使用已知元素查找父元素的属性

不确定标题是否清楚,但基本上我有一些如下所示的XML: 测试1 不确定标题是否清楚,但基本上我有一些如下所示的 XML: <details> <result id=1234567890> <name>Test1</name> </result> <result id=5345345433> <name>Test2</name> </result> <result id=9572385354> <name>Test3</name> </result> 我想要完成的是找到使用已知值的 id 属性 即测试1 > 1234567890,测试2 > 5345345433,测试3 > 9572385354 最好使用 xmllint,但 xmlstarlet 也是一个选项。 输入 首先,您的 XML 无效。你的id属性需要被qouted,并且详细信息没有关闭。这是修改后的输入: <details> <result id="1234567890"> <name>Test1</name> </result> <result id="5345345433"> <name>Test2</name> </result> <result id="9572385354"> <name>Test3</name> </result> </details> 结果 下面将使用 xmlstarlet 提取给定 name 属性的特定 id。 xmlstarlet sel -t -c "/details/result[name='Test1']" test.xml | grep -Po "(?<=id=\")[\d]*" 这会回来 1234567890 您也可以将命令中的 Test1 替换为变量。 var=Test1 xmlstarlet sel -t -c "/details/result[name='$var']" test.xml | grep -Po "(?<=id=\")[\d]*" 故障 xmlstarlet sel -t -c "/details/result[name='$var']" test.xml 选择结果中与 $var 匹配的所有名称标签。 | grep -Po "(?<=id=\")[\d]*" 使用 Perl Regex 将输出通过管道传输到 grep 以查找 id 属性并打印所有包含的数字。 您还可以使用xmllint: xmllint --xpath "string(/details/result[name='Test1']/@id)" yourfile.xml --xpath:告诉 xmllint 使用 xpath 语法进行选择。 xpath选择器的详细信息: string(/details/result[name='Test1']/@id) string():制作字符串 /details/result:选择result元素的details子元素 [name='Test1']:包含一个name节点,其值为Test1 /@id:id属性值(result元素) 也许一个简单的 grep 和 awk 解决方案适合您。 grep -B1 Test1 sample.xml | awk '/id=/{gsub(/[^0-9]+/, "", $0); print $0 }' 完整回答OP的问题, #/bin/bash # # how to use xmllint to get information from specific elements # REQUIRES libxml2 (sorry Snow Leopard!) mytestxml=' <details> <result id="1234567890"> <name>Test1</name> </result> <result id="5345345433"> <name>Test2</name> </result> <result id="9572385354"> <name>Test3</name> </result> </details> ' echo Test Document is :"$mytestxml" echo Get the contents of the \''id'\' attribute of a specific \''result'\' element query=\''string(/details/result[3]/@id)'\' echo xpath query is "$query" myresult=$(echo "$mytestxml" | xmllint --xpath 'string(/details/result[3]/@id)' - ) echo info returned is "$myresult" echo "" echo Get the specific \''result'\' node whose \''name'\' element is \"Test1\" query=\''/details/result[name="Test1"]'\' echo xpath query is "$query" myresult=$(echo "$mytestxml" | xmllint --xpath '/details/result[name="Test1"]' - ) echo info returned is "$myresult" echo "" echo Get the \''id'\' attribute of the specific \''result'\' node whose \''name'\' element is \"Test1\" query=\''string(/details/result[name="Test1"]/@id)'\' echo combined xpath query is "$query" myresult=$(echo "$mytestxml" | xmllint --xpath 'string(/details/result[name="Test1"]/@id)' - ) echo info returned is "$myresult" 获取特定“result”元素的“id”属性的内容。 xpath 查询是: 'string(/details/result[3]/@id)' 返回的信息是:9572385354 获取'name'元素为“Test1”的特定'result'节点 xpath 查询是: '/details/result[name="Test1"]' 返回的信息是: <result id="1234567890"> <name>Test1</name> </result> 获取'name'元素为“Test1”的特定'result'节点的'id'属性 组合的 xpath 查询是: 'string(/details/result[name="Test1"]/@id)' 返回的信息是1234567890 希望这对找到此页面的其他人有用。 :o) 这样的东西应该与 xmlstarlet 一起使用(对我有用): xmlstarlet sel --template --match "/details/result[name='Test1']" --value-of "@id" test.xml

回答 5 投票 0

使用 xmlstarlet 更新现有 xml 文件元素的属性和值

我想编写一个脚本来迭代每个元素“NewTempP”的属性和子元素,并将结构复制到元素“fig”作为子元素。 “NewTempP”...

回答 1 投票 0

xmlstarlet 追加到 XML 中的节点

我有一个包含以下条目的 xml 文件: .... 我有一个包含以下条目的 xml 文件: .... <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> .... 我想在 <analyzer type="index"> 中注入以下 XML 节点: <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="20"/> 因此,最终的预期 XML 如下所示: .... <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="20"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> .... 为此,我尝试使用xmlstarlet,如下所示: xmlstarlet ed --inplace -s "//fieldType" -t elem -n "text_general" -i "//filter" -t attr -n "class" -v ""solr.NGramFilterFactory" minGramSize="1" maxGramSize="20"" <file_name_here> 但显然,这不起作用(当我运行它时,它真的弄乱了我的 XML 文件!)。我对 xmlstarlet 很陌生,并且很难使用正确的语法来实现此目标。我也认为我的尝试中引用有问题。 您应该能够通过创建一个新的 filter 元素,然后向其添加属性来完成此操作(新的 filter 现在是 filter 中的最后一个 analyzer 元素)... xmlstarlet ed --inplace -s '//analyzer[@type="index"]' -t elem -n filter -i '//analyzer[@type="index"]/filter[last()]' -t attr -n class -v solr.NGramFilterFactory -i '//analyzer[@type="index"]/filter[last()]' -t attr -n minGramSize -v 1 -i '//analyzer[@type="index"]/filter[last()]' -t attr -n maxGramSize -v 20 input.xml 另一种选择是使用 XSLT。我认为这比尝试从命令行执行所有操作要容易得多... xmlstarlet tr so.xsl input.xml > output.xml XSLT 1.0(so.xsl) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="analyzer[@type='index']"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="20"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

使用 XMLStarlet 删除属性

我有一个 XML 文档,我想使用 XMLStarlet 从所有元素(或给定类型的所有元素)中删除特定类型的所有属性及其值,而不干扰其...

回答 2 投票 0

如何使用 xmlstarlet 在另一个元素下插入一个新元素?

$ vim test.xml $ xmlstarlet ed -i "/config" -t elem -n "sub" -v "" test.xml ...

回答 6 投票 0

使用 xmlstarlet 更新现有 xml 文件元素

我有以下xml文件: xxx ...

回答 1 投票 0

xmlstarlet。将多行中的多个值更改为 1 行,值之间用“---”分隔。可以吗?

我有这个xml文件(已截断) 34839473 12263522 我有这个 xml 文件(已截断) <adddata dn="articulo"> <attr name="code"> <value>34839473</value> <value>12263522</value> </attr> </adddata> 我想将多值行更新/替换为 1,值之间用“---”分隔。像这样: <attr name="code"> <value>34839473---12263522</value> </attr> 我尝试过: xmlstarlet ed -u "//attr[@name='code']" -x 'concat(value[1], "---", value[2])'` 并导致: <attr name="code">2312341---2348444</attr> 但我不知道如何在行中包含"<value>"和"</value>" 有什么建议吗? 提前致谢 我建议: xmlstarlet edit \ --omit-decl \ --update '//value[1]' --expr 'concat(//value[1], "---", //value[2])' \ --delete '//value[2]' file.xml 输出: <adddata dn="articulo"> <attr name="code"> <value>34839473---12263522</value> </attr> </adddata>

回答 1 投票 0

如何以自动方式修改与 Azure APIM API 或具有附加策略的操作相关的策略

我正在尝试采用一种自动化的方式来修改或应用有关 Azure APIM 的 API 或操作范围的附加策略,并且在我的脚本中,我能够读取变量 $inbound 或 $outbound 或 $backend 或 $

回答 1 投票 0

我可以通过 XML 文档查询路径而不仅仅是叶子吗?

当我使用 XPATH 查询 XML 文档时,我只得到匹配的节点作为结果。有没有办法让匹配的节点及其父节点一直到根? 让我们把这个非常迷你...

回答 1 投票 0

根据XmlStarlet中的动态表达式返回值

我想根据“part1”中给出的值获取文本元素。 在下面的示例 XML 中,我希望返回 Text2 和 Text5,因为 part1 中的值引用 2 和 5。 这怎么可以...

回答 1 投票 0

如何开始学习XMLSTARLET?

如果这个问题已在 xmlsarlet 部分提出,我们深表歉意。我试图搜索它,但找不到,所以将其发布在这里。这样它将来也可以帮助我和其他新手。 作为一个新自由者...

回答 2 投票 0

在 shell 脚本中使用 xmlstarlet 读取脚本变量值,如果该字符串不存在,则插入到特定部分下的输出 xml 文件中

我在 shell 脚本中使用的 parse yaml 实用程序通过 eval 命令生成如下变量 policy1_name='ipfilter' policy1_scope='api' policy1_apiname='apiname' policy1_inboundsession='率-

回答 1 投票 0

xmlstarlet 用于在 xml 字段下插入字符串

我们有一个如下所示的policy.xml文件,需要根据条件在下(入站或后端或出站)下的xml文件的每个会话下插入如下字符串...

回答 1 投票 0

xmlstarlet 编译可执行二进制文件的源代码

环境:docker、ubuntu:最新 尽一切努力制作 Makefile,如文档中所述 https://xmlstar.sourceforge.net/source.php 当然,在 /autogen.sh 步骤上,我做了另一件事,...

回答 1 投票 0

Xmlstarlet 可执行文件或任何替代品

Xmlstarlet 完全符合我的需求,但面临的问题是它没有可执行文件(例如 .jar 文件等)。 我试图通过 shell 脚本使用它,但服务器没有 xmlstarlet ins...

回答 1 投票 0

Xmlstarlet 可执行文件或任何替代品

Xmlstarlet 完全符合我的需求,但面临的问题是它没有可执行文件(例如 .jar 文件等)。 我试图通过 shell 脚本使用它,但服务器没有 xmlstarlet ins...

回答 1 投票 0

使用 xmlstarlet 选择文本中的前两个单词

我有一个简单的 xml 文件,我想使用 xmlstarlet 选择 1) 前两个出现的单词和 2) 元素中的其余单词: 图 1:测试图 我有一个简单的 xml 文件,我想使用 xmlstarlet 选择 1) 前两个出现的单词和 2) 元素中的其余单词: <fig> <caption>Figure 1: Testing the figure</caption> </fig> 结果将如下所示: 图1: 测试图 我已经尝试过了,但不起作用: xmlstarlet ed -s -v substring(//fig/caption,1,string-length(substring-before(//fig/caption," "))+string-length(substring-before(substring-after(//fig/caption," ")," "))+1) input.xml 提前致谢。 奥夫佐 我建议: xmlstarlet select --template -v '//fig/caption' -n input.xml | sed 's/[^ ]* [^ ]* //' 输出: 测试图

回答 1 投票 0

如何从 RSS feed 的“content:encoded”部分中提取 HTML 元素?

我正在尝试生成一份时事通讯,其中除其他内容外,还包括网站上存在的新闻条目。该网站是用 WordPress 构建的,并有 RSS 提要,这不是

回答 1 投票 0

如何在Cygwin中安装xmlstarlet?

我安装了 cygwin,并安装了 xmlstarlet 所需的所有软件包。我已经下载了 xmlstarlet。我尝试使用命令“./xml.exe”从 cygwin 运行它,它有效。我只是想...

回答 2 投票 0

xmlstarlet:如果子元素丢失,如何删除父元素

我有一些像这样的xml:“some.xml”: 一些文字 ...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.