如何使用XMLLINT和BASH解析XML文件中的名称空间

麦克曼

下面是一个用于跟踪库存的Adobe XML swidtag的示例。我需要在bash中使用xmllint解析出相关信息,然后将其输出到新的文本文件中。

例如,我想解析以下内容

swid:entitlement_required_indicator
swid:product_title
swid:product_version
swid:name
swid:numeric
swid:major
swid:minor
swid:build
swid:review

我尝试使用此名称,但它不会让我读取名称空间

xmllint --xpath '//swid:product_version/swid:name/text()' file.xml

我也尝试过

xmllint --xpath "//*[local-name1()='product_version']/*[local-name2()='name']/text()" file.xml

但是得到了这些错误

xmlXPathCompOpEval: function local-nameame1 not found
XPath error : Unregistered function
XPath error : Stack usage errror
XPath evaluation failure

Creative Suite 5的示例标记文件以下示例适用于序列化为Creative Suite 5 Master Collection(Suite)的Adobe Photoshop CS5

<?xml version="1.0" encoding="utf-8"?>
<swid:software_identification_tag xsi:schemaLocation="http://standards.iso.org/iso/19770/-2/2008/schema.xsd software_identification_tag.xsd" 
     xmlns:swid="http://standards.iso.org/iso/19770/-2/2008/schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<!--Mandatory Identity elements -->
<swid:entitlement_required_indicator>true</swid:entitlement_required_indicator>
<swid:product_title>Acrobat XI Pro</swid:product_title>
<swid:product_version>
    <swid:name>1.0</swid:name>
    <swid:numeric>
        <swid:major>1</swid:major>
        <swid:minor>0</swid:minor>
        <swid:build>0</swid:build>
        <swid:review>0</swid:review>
    </swid:numeric>
</swid:product_version>
<swid:software_creator>
    <swid:name>Adobe Systems Incorporated</swid:name>
    <swid:regid>regid.1986-12.com.adobe</swid:regid>
</swid:software_creator>
<swid:software_licensor>
    <swid:name>Adobe Systems Incorporated</swid:name>
    <swid:regid>regid.1986-12.com.adobe</swid:regid>
</swid:software_licensor>
<swid:software_id>
    <swid:unique_id>CreativeCloud-CS6-Mac-GM-MUL</swid:unique_id>
    <swid:tag_creator_regid>regid.1986-12.com.adobe</swid:tag_creator_regid>
</swid:software_id>

<swid:tag_creator>
    <swid:name>Adobe Systems Incorporated</swid:name>
    <swid:regid>regid.1986-12.com.adobe</swid:regid>
</swid:tag_creator>
<!--Optional Identity elements -->
<swid:license_linkage>
    <swid:activation_status>activated</swid:activation_status>
    <swid:channel_type>SUBSCRIPTION</swid:channel_type>
    <swid:customer_type>RETAIL</swid:customer_type>
</swid:license_linkage>
<swid:serial_number>909702426602037824854600</swid:serial_number>
</swid:software_identification_tag>
斯蒂芬·查泽拉斯(Stephane Chazelas)

这个讨论是有启发性的。

至少,即使不理想,您也应该能够做到:

xmllint --xpath "//*[local-name()='product_version']/*[local-name()='name']/text()" file.xml

或改用xmlstarlet

xmlstarlet sel -t -v //swid:product_version/swid:name file.xml

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过在bash中使用xmllint从具有名称空间的xml文件中提取值

使用Java中的XPath和名称空间解析XML

使用 xmllint 在 bash 中解析具有多个属性的 XML

如何使用名称空间解析XML?

如何使用名称空间解析XML

如何使用xml-patch和xpath使用名称空间修补xml文件?

解析XML文件时如何处理默认名称空间

如何使用JAXB使用名称空间解析XML

使用元素名称中的名称空间更新Xml文件(PowerShell)

如何在SQL查询中解析多个名称空间xml

使用lxml在python中解析多个名称空间XML

使用XSD验证XML文件时如何使用名称空间

使用Karate使用名称空间解析XML

使用PowerShell使用名称空间解析XML

使用 bash 中的 xmllint 将 XML 文件中表的两个字段转换为 CSV?

如何使用lxml将名称空间包含到xml文件中?

如何使用包含多个名称空间的spark读取XML文件?

使用名称空间解析xml的问题

使用名称空间信息解析XML

使用DOM解析XML与名称空间

如何使用Java dom从xml中删除名称空间?

使用R中的XML包使用名称空间进行XML解析

xmllint:如何使用本地DTD文件验证XML

如何使用 ElementTree 在具有命名空间的 XML 文件中查找和编辑标签

结合使用LINQ XML和名称空间

使用j查询解析具有名称空间的xml文件

无法使用tcl和tdom解析具有多个名称空间的XML

如何从XML文件中解析某些标签,并使用Bash将它们存储在数组中?

C ++中的头文件和名称空间