XMLStarlet是一组命令行实用程序(工具),可以使用简单的shell命令集来转换,查询,验证和编辑XML文档和文件,就像使用UNIX grep,sed对纯文本文件一样。 awk,diff,patch,join等命令。
当我使用 XPATH 查询 XML 文档时,我只得到匹配的节点作为结果。有没有办法让匹配的节点及其父节点一直到根? 让我们把这个非常迷你...
我想根据“part1”中给出的值获取文本元素。 在下面的示例 XML 中,我希望返回 Text2 和 Text5,因为 part1 中的值引用 2 和 5。 这怎么可以...
如果这个问题已在 xmlsarlet 部分提出,我们深表歉意。我试图搜索它,但找不到,所以将其发布在这里。这样它将来也可以帮助我和其他新手。 作为一个新自由者...
在 shell 脚本中使用 xmlstarlet 读取脚本变量值,如果该字符串不存在,则插入到特定部分下的输出 xml 文件中
我在 shell 脚本中使用的 parse yaml 实用程序通过 eval 命令生成如下变量 policy1_name='ipfilter' policy1_scope='api' policy1_apiname='apiname' policy1_inboundsession='率-
我们有一个如下所示的policy.xml文件,需要根据条件在下(入站或后端或出站)下的xml文件的每个会话下插入如下字符串...
环境:docker、ubuntu:最新 尽一切努力制作 Makefile,如文档中所述 https://xmlstar.sourceforge.net/source.php 当然,在 /autogen.sh 步骤上,我做了另一件事,...
Xmlstarlet 完全符合我的需求,但面临的问题是它没有可执行文件(例如 .jar 文件等)。 我试图通过 shell 脚本使用它,但服务器没有 xmlstarlet ins...
Xmlstarlet 完全符合我的需求,但面临的问题是它没有可执行文件(例如 .jar 文件等)。 我试图通过 shell 脚本使用它,但服务器没有 xmlstarlet ins...
我有一个简单的 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/[^ ]* [^ ]* //' 输出: 测试图
如何从 RSS feed 的“content:encoded”部分中提取 HTML 元素?
我正在尝试生成一份时事通讯,其中除其他内容外,还包括网站上存在的新闻条目。该网站是用 WordPress 构建的,并有 RSS 提要,这不是
我安装了 cygwin,并安装了 xmlstarlet 所需的所有软件包。我已经下载了 xmlstarlet。我尝试使用命令“./xml.exe”从 cygwin 运行它,它有效。我只是想...
当第一个元素中存在多个 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 任何一个都应该给你预期的输出。
xmlstarlet 修改正文中的 XML 属性,该正文还具有具有特定值的属性
我正在创建一个 bash 脚本来使用 XMLStarlet 替换大型 XML 文件中的各种值。 对于一种特定情况,我无法找到正确的 XMLStarlet 命令行语法。 我创建了一个简化...
假设我们有这个简单的 xmlstarlet 脚本: 寻找 。 -iname '*.xml' | xargs xmlstarlet sel -N z="abc.com/article/1.0/" \ -t -m "/z:ad" -i "/*/z:status='PUBLIC'"...
我正在尝试用另一个文件中的内容替换文件中的多行模式匹配。 例如: 文件1.xml a 我正在尝试用另一个文件中的内容替换文件中的多行模式匹配。 例如: 文件1.xml <root> <child> <subchild>a</subchild> </child> </root> 文件2.xml <child> <subchild>a</subchild> <subchild>b</subchild> <subchild>c</subchild> </child> 将 <clild> </child> 中的整个 file1.xml 标签替换为 file2.xml 输出: <root> <child> <subchild>a</subchild> <subchild>b</subchild> <subchild>c</subchild> </child> </root> 我已经尝试使用 sed 和 /r 并读取 xmlstarlet,但无法使其正常工作。任何指针。 TIA 这可能对你有用(GNU sed): sed -e '1i/<child>/,/<\\/child>/c\\' -e '$!s/$/\\/' file2 | sed -f - file1 使用 file2 编写 sed 脚本。 使用从 <child> 到 </child> 的范围将匹配更改为所需的结果。 替代方案: sed -e '/<child>/{:a;N;/<\/child>/!ba;r file2' -e 'd}' file1 有这样一个怪物: ( echo '<w><t>' cat file1.xml echo '</t><n>' cat file2.xml echo '</n></w>' ) | xmlstarlet ed -O \ -m /w/t/root/child/following-sibling::'*' /w/n \ -d /w/t/root/child \ -m /w/n/'*' /w/t/root \ -m /w/t/root / \ -d /w'[1]'
使用bash我试图从下面的soap响应中提取id和name作为键值对,并希望将此对存储在csv文件中。 下面的 xmllint 命令返回不需要的值,因为我无法...
使用 xmlstarlet 匹配块内的属性并更新同一块内的同级属性
关注 xml 文件 mg.xml 科姆斯 从 xml 文件开始,mg.xml <?xml version="1.0"?> <domain type="kvm"> <name>Comus</name> <devices> <interface type="network"> <mac address="52:54:00:46:a3:25"/> <source network="default"/> <model type="virtio"/> <link state="down"/> <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/> </interface> <interface type="bridge"> <mac address="52:54:00:6c:0e:d0"/> <source bridge="br0"/> <model type="virtio"/> <link state="up"/> <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/> </interface> </devices> </domain> 我需要将 mac 地址匹配“52:54:00:46:a3:25”的块的链接状态属性更新为“up” 最终结果应该是 <?xml version="1.0"?> <domain type="kvm"> <name>Comus</name> <devices> <interface type="network"> <mac address="52:54:00:46:a3:25"/> <source network="default"/> <model type="virtio"/> <link state="up"/> <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/> </interface> <interface type="bridge"> <mac address="52:54:00:6c:0e:d0"/> <source bridge="br0"/> <model type="virtio"/> <link state="up"/> <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/> </interface> </devices> </domain> 我已经做到了 xmlstarlet edit -L -u "/domain/devices/interface/mac[@address='52:54:00:6c:0e:d0']/@address" -v "up" mg.xml 但是,这当然会将 MAC 地址更新为“up”,而不是链接状态。 像这样: xmlstarlet edit -u '/domain/devices/interface/mac[@address="52:54:00:46:a3:25"]/parent::link/@state='up'" -v 'up' mg.xml
XMLStarlet 错误:xmlSAX2Characters:巨大的文本节点:内存不足
我在尝试使用 xmlstarlet 解析 xml 时遇到错误。 -:1.13408001:xmlSAX2Characters:巨大的文本节点:内存不足
我需要使用 xmlstarlet 来过滤 XML 的内容并根据子元素标准导出元素 使用这种 xml: 1-70-032-0023 我需要使用 xmlstarlet 来过滤 XML 的内容并根据子元素标准导出元素 使用这种xml: <products> <product> <product_code>1-70-032-0023</product_code> <availability>criteria_i_need</availability> <quantity>393</quantity> </product> <product> <product_code>1-70-032-0024</product_code> <availability>criteria_i_need</availability> <quantity>19</quantity> </product> <product> <product_code>1-70-032-0046</product_code> <availability>criteria_i_do_NOT_need</availability> <quantity>351</quantity> </product> </products> 使用命令: xmlstarlet ed -d '/product/availability[. = "criteria_i_need"]' input-file.xml > filtered-file.xml 但输出文件包含所有元素,而不仅仅是符合条件的 2 个第一个元素。 不完全清楚您期望filtered-file.xml包含什么,但是由于您使用ed -d作为论点,我假设您想删除一个<product>确实不符合您的标准并保存其余的。 所以我会把你的命令改为 xmlstarlet ed -d '//product[not(.//availability[. = "criteria_i_need"])]' input-file.xml > filtered-file.xml 看看它是否有效。 或者,您可以删除特定条件,例如: xmlstarlet ed -d 'products/product[availability = "criteria_i_do_NOT_need"]' 或与contains(): xmlstarlet ed -d 'products/product[contains(availability, "_NOT_")]'