xml - 从具有相似块的 XML 文件中提取数据
问题描述
来源
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<lima2t:runlargeResponse xmlns:lima2t="uri://Metadata.com/home/1.0">
<data>
<capacity>
<name>Everyday.Italian.Dish</name>
<currency>($)</currency>
<CashAmount>not.used.for.this.transaction</CashAmount>
<CheckAmount>not.used.for.this.transaction</CheckAmount>
<CreditAmount>not.used.for.this.transaction</CreditAmount>
</capacity>
<capacity>
<name>Everyday.French.Dish</name>
<currency>($)</currency>
<CashAmount>not.used.for.this.transaction</CashAmount>
<CheckAmount>not.used.for.this.transaction</CheckAmount>
<CreditAmount>134,70</CreditAmount>
</capacity>
</data>
</lima2t:runlargeResponse>
</soap:Body>
</soap:Envelope>
目标提取:
134,70
从<CreditAmount>134,70</CreditAmount>
我试过这个命令,但命令会在屏幕上输出所有内容
xmllint --path '//soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/soap:Body/lima2t:runlargeResponse xmlns:lima2t="uri://Metadata.com/home/1.0"/data/capacity/@name="Everyday.French.Dish"/CreditAmount/text()' op.xml
我感觉好像少了点什么但我找不到什么
解决方案
像这样:
xmllint --xpath '
//data/capacity[name="Everyday.French.Dish"]/CreditAmount/text()
' op.xml
或者使用 shell 开关(需要额外的后处理来去除垃圾):
xmllint --shell op.xml<<EOF
cat //data/capacity[name="Everyday.French.Dish"]/CreditAmount/text()
EOF
或使用xmlstarlet:
xmlstarlet sel -t -v '
//data/capacity[name="Everyday.French.Dish"]/CreditAmount/text()
' op.xml
输出:
134,70
推荐阅读
- php - php 7.4 自动格式化 sublime text 3 中的类型属性
- java - Can't figure out why abstract method isn't overriding
- android - Firestore 查询失败的可能性
- python - 添加现有值而不是替换它们
- java - 如何从 Java 中的另一个类访问变量?
- mysql - 优化并减小 Union Select Query 的大小
- java - 红绿灯应用 Android Studio
- python - 如何使用方法更改按钮的 on_release 功能?
- php - laravel 框架中是否有使用表单输入数据更新数据库中当前记录的功能?
- swiftui - SwiftUI - OnDelete 后刷新崩溃