我需要从这个xml中提取名称值(Product Finder):
文件:config.xml
<?xml version="1.0" encoding="utf-8"?>
<widget id="com.abc.app" version="1.3.1" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0" ios-CFBundleVersion="1.3.1.5" android-versionCode="5">
<name>Product Finder</name>
<description>
Description
</description>
</widget>
我试过了:
mles$ xmllint --xpath "/widget/name/text()" config.xml
XPath set is empty
这可能是因为我的config.xml
文件有其他名称空间。根据{{3}}问题,我需要手动设置命名空间。所以我试过了:
mles$ xmllint --shell config.xml / > setns x=http://www.w3.org/ns/widgets / > xpath /x:widget/name/text
这个没有输出。什么是使用xmllint提取名称值的正确语法?
注意:我已经有一个带有grep和sed的this,但我想使用xmllint。
答案 0 :(得分:3)
请注意,不仅声明默认命名空间的元素驻留在该命名空间中,而且没有前缀且没有本地默认命名空间的所有后代元素都隐式地从祖先继承默认命名空间。这意味着您还需要使用前缀x
来引用name
元素,因为它从widget
继承了默认命名空间:
/ > xpath /x:widget/x:name/text()[1]
答案 1 :(得分:3)
您的文件使用名称空间(xmlns)。为了独立于这些,我建议:
xmllint --xpath "//*[local-name()='widget']/*[local-name()='name']/text()" config.xml
输出:
Product Finder