xmlstarlet 相关问题

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

当第一个元素中存在多个 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

xmlstarlet 修改正文中的 XML 属性,该正文还具有具有特定值的属性

我正在创建一个 bash 脚本来使用 XMLStarlet 替换大型 XML 文件中的各种值。 对于一种特定情况,我无法找到正确的 XMLStarlet 命令行语法。 我创建了一个简化...

回答 1 投票 0

如何使用 XMLStarlet 查找第二个文件中的值

假设我们有这个简单的 xmlstarlet 脚本: 寻找 。 -iname '*.xml' | xargs xmlstarlet sel -N z="abc.com/article/1.0/" \ -t -m "/z:ad" -i "/*/z:status='PUBLIC'"...

回答 1 投票 0

用另一个文件中的内容替换一个文件中的模式

我正在尝试用另一个文件中的内容替换文件中的多行模式匹配。 例如: 文件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]'

回答 2 投票 0

如何从soap响应中解析xpath以检索键值对

使用bash我试图从下面的soap响应中提取id和name作为键值对,并希望将此对存储在csv文件中。 下面的 xmllint 命令返回不需要的值,因为我无法...

回答 1 投票 0

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

回答 1 投票 0

XMLStarlet 错误:xmlSAX2Characters:巨大的文本节点:内存不足

我在尝试使用 xmlstarlet 解析 xml 时遇到错误。 -:1.13408001:xmlSAX2Characters:巨大的文本节点:内存不足

回答 1 投票 0

XMLstarlet 过滤器和导出

我需要使用 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_")]'

回答 1 投票 0

使用 xmlstarlet 模式匹配元素标签

我正在尝试确定当标记元素不是常量时如何使用 xmlstarlet 获取 xml 标记和值。 例如, 输入文件: 我正在尝试确定当标记元素不是常量时如何使用 xmlstarlet 获取 xml 标记和值。 例如, 输入文件: <?xml version="1.0" encoding="us-ascii"?> <ST> <Data3020> <value>0</value> <detailType>N/A</detailType> </Data3020> <Data3030> <value>0</value> <detailType>N/A</detailType> </Data3030> <Data3040> <value>0</value> <detailType>N/A</detailType> </Data3040> <Data3080> <value>0</value> <detailType>N/A</detailType> </Data3080> <Data3090> <value>0</value> <detailType>N/A</detailType> </Data3090> </ST> 预期产出: BoxName|value|detailType| Data3020|100|N/A| Data3030|10|N/A| Data3030|70|N/A| Data3040|770|N/A| Data3050|44|N/A| 我尝试了以下方法来分别获取标签名称和值,但我不知道如何组合它们 xmlstarlet sel -t -m "/ST/*" -v "name()" -nl test.xml Data3020 Data3030 Data3040 Data3080 Data3090 xmlstarlet sel --template --value-of "//ST" test.xml 110 N/A 10 N/A 70 N/A 770 N/A 44 N/A

回答 0 投票 0

如何使用xmlstarlet合并两个xml?你好,世界</</desc> <question vote="3"> <p>我想对 xml 元素进行数字排序,但在最后一步(合并两个 xml)失败了。<br/> 这是我试过的:</p> <h3>xml文件的内容</h3> <pre><code>$ cat input.xml <root> <title>hello, world</title> <items> <item>2</item> <item>1</item> <item>3</item> </items> </root> </code></pre> <h3>排序项目</h3> <pre><code>$ xmlstarlet sel -R -t -m '//item' -s A:N:- 'number(.)' -c '.' -n input.xml <xsl-select> <item>1</item> <item>2</item> <item>3</item> </xsl-select> </code></pre> <h3>删除项目</h3> <pre><code>$ xmlstarlet ed -d '//item' input.xml <?xml version="1.0"?> <root> <title>hello, world</title> <items/> </root> </code></pre> <h3>如何合并输出?结果应该是:</h3> <pre><code><root> <title>hello, world</title> <items> <item>1</item> <item>2</item> <item>3</item> </items> </root> </code></pre> </question> <answer tick="false" vote="2"> <p>我不熟悉 xmlstarlet,但就我在其文档中看到的内容而言,它可用于将 XSL 转换应用于 XML 文件 (<pre><code>tr</code></pre>) - 您可以将此命令与此 XSLT 一起使用:</p> <pre><code><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="items"> <xsl:copy> <xsl:apply-templates select="item"> <xsl:sort select="." data-type="number"/> </xsl:apply-templates> </xsl:copy> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> </code></pre> <p>在单个操作中生成排序和合并的输出。</p> </answer> <answer tick="false" vote="0"> <p>你已经问了一段时间了,但仍然如此。下壳 脚本使用多阶段流水线产生想要的结果—— 尽管这不是处理更大输入的最佳方式。 有关使用 <a href="http://www.w3.org/TR/xinclude/" rel="nofollow noreferrer" title="W3C XML Inclusions 1.0 2E recommendation">XInclude</a> 和 <pre><code>xmlstarlet</code></pre> 的方法,请参见 <a href="https://stackoverflow.com/a/76035373/14403369">这个</a>答案。</p> <pre><code># shellcheck shell=sh xmlstarlet select -R -t -m '//item' -s 'A:N:-' '.' -c '.' input.xml | xmlstarlet select -R -t -c '/ | document("-")' input.xml | xmlstarlet edit \ -d '/xsl-select/root//item' \ -m '/xsl-select/xsl-select/item' '/xsl-select/root/items' | xmlstarlet select -B -I -t -c '/xsl-select/*[1]' </code></pre> <ol> <li>运行<pre><code>select</code></pre>提取<pre><code>item</code></pre>s的排序文件(到<pre><code>stdout</code></pre>)</li> <li>运行<pre><code>select</code></pre>复制原始输入和排序文件和 (<pre><code>-R</code></pre>) 使用 XSLT 将它们包装在一起 <a href="https://www.w3.org/TR/1999/REC-xslt-19991116#function-document" rel="nofollow noreferrer" title="node-set document(object, node-set?) - W3C XSLT 1.0 recommendation"><pre><code>document</code></pre></a>功能访问 <pre><code>stdin</code></pre> 上的排序文件(下面列出了此步骤的输出)</li> <li>调用<pre><code>edit</code></pre>删除未排序的<pre><code>item</code></pre>s并移动已排序的 <pre><code>item</code></pre>就位</li> <li>运行<pre><code>select</code></pre>提取并格式化合并后的文档</li> </ol> <p>第 2 步的输出(缩进):</p> <pre><code><xsl-select> <root> <title>hello, world</title> <items> <item>2</item> <item>1</item> <item>3</item> </items> </root> <xsl-select> <item>1</item> <item>2</item> <item>3</item> </xsl-select> </xsl-select> </code></pre> </answer> </body></html>

我想对xml元素进行数字排序,但在最后一步(合并两个xml)失败了。 这是我试过的: xml文件的内容 $ 猫输入.xml 你好,世界</</desc> <question vote="3"> <p>我想对 xml 元素进行数字排序,但在最后一步(合并两个 xml)失败了。<br/> 这是我试过的:</p> <h3>xml文件的内容</h3> <pre><code>$ cat input.xml <root> <title>hello, world</title> <items> <item>2</item> <item>1</item> <item>3</item> </items> </root> </code></pre> <h3>排序项目</h3> <pre><code>$ xmlstarlet sel -R -t -m '//item' -s A:N:- 'number(.)' -c '.' -n input.xml <xsl-select> <item>1</item> <item>2</item> <item>3</item> </xsl-select> </code></pre> <h3>删除项目</h3> <pre><code>$ xmlstarlet ed -d '//item' input.xml <?xml version="1.0"?> <root> <title>hello, world</title> <items/> </root> </code></pre> <h3>如何合并输出?结果应该是:</h3> <pre><code><root> <title>hello, world</title> <items> <item>1</item> <item>2</item> <item>3</item> </items> </root> </code></pre> </question> <answer tick="false" vote="2"> <p>我不熟悉 xmlstarlet,但就我在其文档中看到的内容而言,它可用于将 XSL 转换应用于 XML 文件 (<pre><code>tr</code></pre>) - 您可以将此命令与此 XSLT 一起使用:</p> <pre><code><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="items"> <xsl:copy> <xsl:apply-templates select="item"> <xsl:sort select="." data-type="number"/> </xsl:apply-templates> </xsl:copy> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> </code></pre> <p>在单个操作中生成排序和合并的输出。</p> </answer> <answer tick="false" vote="0"> <p>你已经问了一段时间了,但仍然如此。下壳 脚本使用多阶段流水线产生想要的结果—— 尽管这不是处理更大输入的最佳方式。 有关使用 <a href="http://www.w3.org/TR/xinclude/" rel="nofollow noreferrer" title="W3C XML Inclusions 1.0 2E recommendation">XInclude</a> 和 <pre><code>xmlstarlet</code></pre> 的方法,请参见 <a href="https://stackoverflow.com/a/76035373/14403369">这个</a>答案。</p> <pre><code># shellcheck shell=sh xmlstarlet select -R -t -m '//item' -s 'A:N:-' '.' -c '.' input.xml | xmlstarlet select -R -t -c '/ | document("-")' input.xml | xmlstarlet edit \ -d '/xsl-select/root//item' \ -m '/xsl-select/xsl-select/item' '/xsl-select/root/items' | xmlstarlet select -B -I -t -c '/xsl-select/*[1]' </code></pre> <ol> <li>运行<pre><code>select</code></pre>提取<pre><code>item</code></pre>s的排序文件(到<pre><code>stdout</code></pre>)</li> <li>运行<pre><code>select</code></pre>复制原始输入和排序文件和 (<pre><code>-R</code></pre>) 使用 XSLT 将它们包装在一起 <a href="https://www.w3.org/TR/1999/REC-xslt-19991116#function-document" rel="nofollow noreferrer" title="node-set document(object, node-set?) - W3C XSLT 1.0 recommendation"><pre><code>document</code></pre></a>功能访问 <pre><code>stdin</code></pre> 上的排序文件(下面列出了此步骤的输出)</li> <li>调用<pre><code>edit</code></pre>删除未排序的<pre><code>item</code></pre>s并移动已排序的 <pre><code>item</code></pre>就位</li> <li>运行<pre><code>select</code></pre>提取并格式化合并后的文档</li> </ol> <p>第 2 步的输出(缩进):</p> <pre><code><xsl-select> <root> <title>hello, world</title> <items> <item>2</item> <item>1</item> <item>3</item> </items> </root> <xsl-select> <item>1</item> <item>2</item> <item>3</item> </xsl-select> </xsl-select> </code></pre> </answer> </body></html>

回答 0 投票 0

向 XML 添加属性

要编辑的 XML - 要编辑的 XML - <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <broker xmlns="http://activemq.apache.org/schema"> <jaas-security domain="activemq"/> <server configuration="file:/Users/gugu/Docs/artemis/var/lib/broker/etc//broker.xml"/> <web path="web" rootRedirectLocation="console"> <binding uri="https://localhost:8161"> <app url="activemq-branding" war="activemq-branding.war"/> <app url="artemis-plugin" war="artemis-plugin.war"/> <app url="console" war="console.war"/> </binding> </web> </broker> 在上面的 XML 中,我想添加以下属性uri="https://localhost:8161". keyStorePath="$path/server-keystore.jks" keyStorePassword="password" 添加这些后,需要将http更改为https,还可能需要更改端口。 结果- <binding uri="https://localhost:8443" keyStorePath="$path/server-keystore.jks" keyStorePassword="securepass"> 上面用于keystone.jks的路径和密码应该来自两个不同的变量。 有人可以帮助我如何使用 XMLstarlet 或 sed 命令就地编辑它吗? 我试过的- 要添加属性,(首先我尝试不使用变量) xmlstarlet edit --inplace \ --insert "/broker/web/binding[not(@keyStorePath)]" --type attr -n keyStorePath --value ".ssl/server-keystore.jks" \ bootstrap.xml 文件没有变化 您的 XML 文件使用 namespaces (xmlns=)。这将添加两个属性并更新一个属性: xmlstarlet edit \ -N x='http://activemq.apache.org/schema' \ --insert '//x:broker/x:web/x:binding' --type attr -n 'keyStorePath' --value '$path/server-keystore.jks' \ --insert '//x:broker/x:web/x:binding' --type attr -n 'keyStorePassword' --value 'password' \ --update '//x:broker/x:web/x:binding/@uri' --value 'https://localhost:8443' \ file.xml 输出: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <broker xmlns="http://activemq.apache.org/schema"> <jaas-security domain="activemq"/> <server configuration="file:/Users/gugu/Docs/artemis/var/lib/broker/etc//broker.xml"/> <web path="web" rootRedirectLocation="console"> <binding uri="https://localhost:8443" keyStorePath="$path/server-keystore.jks" keyStorePassword="password"> <app url="activemq-branding" war="activemq-branding.war"/> <app url="artemis-plugin" war="artemis-plugin.war"/> <app url="console" war="console.war"/> </binding> </web> </broker> 关于语法的信息:xmlstarlet edit

回答 1 投票 0

如何交换两个兄弟姐妹的位置:使用xmlstarlet

如何交换两个兄弟姐妹的位置: 从: 约翰 佩特森 如何交换两个兄弟姐妹的位置: 来自: <article> <name> <firstname>John</firstname> <surname>Pettterson</surname> </name> </article> 至: <article> <name> <surname>Pettterson</surname> <firstname>John</firstname> </name> </article> 提前致谢。 大富士 这就是我所做的: xmlstarlet ed -L -i "//article/name/givenname" -t elem -n "surname1" -v "$(xmlstarlet sel -t -v "//article/name/surname" swapelment.xml)" swapelment.xml xmlstarlet ed -L -d "//article/name/surname" swapelment.xml xmlstarlet ed -L --rename "//article/name/surname1" -v "surname" swapelment.xml 创建一个新的兄弟元素<surname1>作为第一个兄弟元素,并将元素<surname>的值复制到它。 删除元素<surname>. 将创建的元素 <surname1> 重命名为 <surname>.

回答 1 投票 0

使用 xmlstarlet 转义 xml 文件

我有两个 xml 文件 A 和 B。我想在 A 到 B 中插入某些元素节点。一切顺利,但导入的元素在 B 中不是“unescape”: XML 文件 A: 我有两个 xml 文件 A 和 B。我想在 A 到 B 中插入某些元素节点。一切顺利,但导入的元素在 B 中不是“unescape”: XML文件A: <?xml version="1.0"?> <article> <publication> <authors> <author> <givenname locale="en_US">Admin</givenname> <givenname locale="nb_NO">Admin</givenname> <familyname locale="en_US">Septentrio</familyname> <email>[email protected]</email> </author> <author include_in_browse="true" user_group_ref="Forfatter" seq="0" id="13075"> <givenname locale="nb_NO">Peter</givenname> <familyname locale="nb_NO">Nilsen</familyname> <affiliation locale="nb_NO">NTL University</affiliation> <country>NO</country> <email>[email protected]</email> </author> </authors> </publication> </article> XML file B: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.2 20190208//EN" "JATS-archivearticle1.dtd"> <article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="other"> <front> </front> </article> 当我跑步时: xmlstarlet ed -L -s "//article/front" -t elem -n "newchild" -v "$(xmlstarlet sel --omit-decl -t -c "/article/publication/authors/author" a.xml)" b.xml 它在 B 文件中给了我以下内容: <!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.2 20190208//EN" "JATS-archivearticle1.dtd"> <article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="other"> <front> <newchild>&lt;author&gt; &lt;givenname locale="en_US"&gt;Admin&lt;/givenname&gt; &lt;givenname locale="nb_NO"&gt;Admin&lt;/givenname&gt; &lt;familyname locale="en_US"&gt;Septentrio&lt;/familyname&gt; &lt;email&gt;[email protected]&lt;/email&gt; &lt;/author&gt;&lt;author include_in_browse="true" user_group_ref="Forfatter" seq="0" id="13075"&gt; &lt;givenname locale="nb_NO"&gt;Peter&lt;/givenname&gt; &lt;familyname locale="nb_NO"&gt;Nilsen&lt;/familyname&gt; &lt;affiliation locale="nb_NO"&gt;NTL University&lt;/affiliation&gt; &lt;country&gt;NO&lt;/country&gt; &lt;email&gt;[email protected]&lt;/email&gt; &lt;/author&gt;</newchild></front> </article> 我怎么能对结果做unesc 谢谢。 大风藏 使用xmllint,在文件B上创建newchild,并将其内容设置为文件A中的//author元素 (printf '%s\n' "cd //article/front" "set <newchild></newchild>" "cd newchild" "set $(xmllint --xpath "//author" a.xml | sed -ze 's/\n/\&#xA;/g')" "save" "bye") | xmllint --shell b.xml 单行输出 / > cd //article/front front > set <newchild></newchild> front > cd newchild newchild > set <author>&#xA; <givenname locale="en_US">Admin</givenname>&#xA; <givenname locale="nb_NO">Admin</givenname>&#xA; <familyname locale="en_US">Septentrio</familyname>&#xA; <email>[email protected]</email>&#xA; </author>&#xA;<author include_in_browse="true" user_group_ref="Forfatter" seq="0" id="13075">&#xA; <givenname locale="nb_NO">Peter</givenname>&#xA; <familyname locale="nb_NO">Nilsen</familyname>&#xA; <affiliation locale="nb_NO">NTL University</affiliation>&#xA; <country>NO</country>&#xA; <email>[email protected]</email>&#xA; </author>&#xA; newchild > save newchild > bye sed -ze 's/\n/\&#xA;/g' 用他们的 html 实体替换普通的新行,以避免将它们发送到管道 xmllint --shell 像这样: $ xmlstarlet unesc < file.xml <!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.2 20190208//EN" "JATS-archivearticle1.dtd"> <article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="other"> <front> <newchild><author> <givenname locale="en_US">Admin</givenname> <givenname locale="nb_NO">Admin</givenname> <familyname locale="en_US">Septentrio</familyname> <email>[email protected]</email> </author><author include_in_browse="true" user_group_ref="Forfatter" seq="0" id="13075"> <givenname locale="nb_NO">Peter</givenname> <familyname locale="nb_NO">Nilsen</familyname> <affiliation locale="nb_NO">NTL University</affiliation> <country>NO</country> <email>[email protected]</email> </author></newchild></front> </article> 就地编辑: $ xmlstarlet unesc < file.xml | sponge file 另一种方法是使用 XSLT,例如这是一个简单的 XSLT 样式表,它使用您示例中的 XPath 表达式,我称之为insert.xsl: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="author-doc"/> <xsl:template match="*"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="article/front"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> <newchild> <xsl:copy-of select="document($author-doc)/article/publication/authors/author"/> </newchild> </xsl:copy> </xsl:template> </xsl:stylesheet> 调用它: xmlstarlet tr insert.xsl -s author-doc=a.xml b.xml

回答 3 投票 0

遍历xml并将元素值复制到xmlstarlet中的另一个

我有两个 xml 文件。我想提取 xml1 中的元素值并将它们分配给 xml2。 XML1: 我有两个 xml 文件。我想提取 xml1 中的元素值并将它们分配给 xml2。 xml1: <?xml version="1.0" encoding="windows-1252"?> <dataTemplate> <test>John</test> <test>Peter</test> <test>Paul</test> </dataTemplate> 我想将值导出到 xml2,它看起来像这样: <?xml version="1.0" encoding="windows-1252"?> <sec> <author>John</author> <author>Peter</author> <author>Paul</author> </sec> 我的 xmlstartlet 脚本: #!/bin/bash IMPORT=$(xmlstarlet sel -t -v "//dataTemplate/test" xml1.xml) xmlstarlet ed -L -s "//sec" -t elem -n "author" -v "$LOBCODE" xml2.xml 结果看起来像这样而不是我想要的: <sec> <author>John Peter Paul</author> </sec> 来了^^ $ xmlstarlet edit -r '/dataTemplate' -v 'sec' xml1 <?xml version="1.0" encoding="windows-1252"?> <sec> <test>John</test> <test>Peter</test> <test>Paul</test> </sec> 所以 $ xmlstarlet edit -r '/dataTemplate' -v 'sec' xml1 | tee xml2 我会尽量在这里解释更多。我想提取如下所述的值。 xml1 中的示例 John 被导出并转换为 xml2 文件中的 John 来自 xml1 的示例 Peter 被导出并转换为 xml2 文件中的 Peter 来自 xml1 的示例 Paul 被导出并转换为 xml2 文件中的 Paul 示例 xml1: <?xml version="1.0" encoding="windows-1252"?> <dataTemplate> <test>John</test> <test>Peter</test> <test>Paul</test> ... </dataTemplate> <dataTemplate1> <name>John</name> <name>Peter</name> <name>Paul</name> </dataTemplate1> </dataTemplate> 已有的xml2已经包含其他元素: <?xml version="1.0" encoding="windows-1252"?> **<sec> <author>John</author> <author>John</author> <author>John</author> </sec>** <record> <school>Mary</school> <school>Mary</school> <school>Mary</school> </record>

回答 2 投票 0

使用xmlstarlet的XPath表达式更新XML。

我有一个junit报告XML文件,像这样。 ...

回答 1 投票 0

XML标签到bash变量

$title = Email Title

回答 1 投票 -3

用python快速从网页集合中提取html标签的方法

我试图从一个包含html文档集合的.gz文件中检索内容,这是一个GOV2集合的文件。每个页面都是由标签分开的,每个标签包含...

回答 1 投票 4

根据属性名称xmlstarlet更新标签值

我有一个文件: YYYY &...

回答 1 投票 0

回答 1 投票 -2

回答 1 投票 0

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