xmlstarlet 相关问题

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

使用 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

当第一个元素中存在多个 xmlns 属性时,xmlstarlet 无法添加子节点

我有一个xml文件test.gpx: 猫测试.gpx 我有一个 xml 文件 test.gpx: cat test.gpx <?xml version="1.0" encoding="UTF-8"?> <gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1"> <trk> <name>Name 1</name> <desc>Description 1</desc> </trk> <trk> <name>Name 2</name> <desc>Description 2</desc> </trk> </gpx> 尝试在此文件中插入子节点时,xmlstartlet无法成功执行: xmlstarlet edit --subnode "/gpx/trk" --type elem -n "new" -v "Hello World!" test.gpx <?xml version="1.0" encoding="UTF-8"?> <gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1"> <trk> <name>Name 1</name> <desc>Description 1</desc> </trk> <trk> <name>Name 2</name> <desc>Description 2</desc> </trk> </gpx> 虽然第一个 gpx 元素中只有一个属性,但它有效: xmlstarlet edit --subnode "/gpx/trk" --type elem -n "new" -v "Hello World!" test.gpx <?xml version="1.0" encoding="UTF-8"?> <gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <trk> <name>Name 1</name> <desc>Description 1</desc> <new>Hello World!</new> </trk> <trk> <name>Name 2</name> <desc>Description 2</desc> <new>Hello World!</new> </trk> </gpx> 因此我的问题是:我如何才能成功处理原始文件,在其第一个 gpx 元素中具有多个属性? 版本信息: xmlstarlet --version 1.6.1 compiled against libxml2 2.9.10, linked with 20913 compiled against libxslt 1.1.34, linked with 10134 在 Ubuntu 22.04 上。 您正在处理的属性不仅仅是普通的属性 - 它们是命名空间并且必须相应地考虑在内。由于您的第一个(但不是第二个)文件中有默认名称空间,因此您可以通过以下两种方式之一来处理它。 长而明确的方式: xmlstarlet ed -N x=http://www.topografix.com/GPX/1/1 --subnode "/x:gpx/x:trk" --type elem -n "new" -v "Hello World!" test.gpx 或更短的: xmlstarlet ed --subnode "/_:gpx/_:trk" --type elem -n "new" -v "Hello World!" test.gpx 任何一个都应该给你预期的输出。

回答 1 投票 0

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