1

我正在寻找一种简单的方法(实用程序、函数、工具)来对 xml 格式的数据运行布尔逻辑,并且很可能通过 shell 脚本。这与翻译 xml 或创建其他文档无关,而是允许基本操作 <、>、=、!= 的简单逻辑决策

假设给定一个xml文件,2012_04_21.xml其中包含(除其他外)xml键和值 <data>...<price>6.50</price>...</data>

我理想的工具是:

cooltool --input 2012-04-21.xml --eval "price <= 6.50"

根据给定的逻辑返回真、假、无或其他东西

grep适用于 'has' 或 '==' 类型的操作。grep '<key>value</key>' 2012_04_21.xml不提供任何内容或可以布尔化的匹配字符串。

但是,grep 无法满足以下原因:1. 不可能price > 5.00 2. 无法处理像这样的层次结构data/price > 5.00

XPATH 逻辑是完全足够的,但我正在努力想出一种在这种情况下利用它的方法。

xsltproc mylogic.xsl 2012-04-21.xml

嗯,也许是一个组合xsltproc mylogic.xsl 2012-04-21.xml | grep true

我试一试。

欢迎任何其他想法。

4

2 回答 2

3

这听起来像是你可以用一个简单的 XPath 查询来做的事情;不太确定你的源文件有多复杂,但这听起来像你可以做的事情xmllint

xmllint --xpath "boolean(//price[text()<=6.50])" xmlfile.xml

您可以编写自己的实用程序脚本...注意我的 XPath 查询假设

  1. 您的 XML 文件没有固定的结构
  2. 您的 XML 文件可以有可重复的<price>标签

.

#!/bin/bash

xmllint --xpath "boolean(//price[text()<=$2])" $1

./ingest.sh xmlfile.xml 6.50

如果您想使用 grep,可能需要查看现有问题 [1,2,3]。

[1]如何使用 grep 在 xml 标签中查找信息?
[2]如何在 Bash 中解析 XML?
[3]如何 (e) grep XML 获取某些标签内容?

于 2013-01-01T09:44:45.773 回答
1

鉴于以下数据

$ cat data.xml
<data>
    <price>10.50</price>
    <price>5.50</price>
</data>

选项 1:一个线性 xpath 检查

以下 xmllint 程序会找到有问题的 XML 标记:

$ echo "cat //price[text()<=6.50]" | xmllint --shell data.xml | grep "<price>" && echo "found"
<price>5.50</price>
found

“grep”命令的退出代码可以在 shell 脚本中用于测试 XML 是否被验证。

选项 2:生成 XML 模式

以下 shell 脚本生成一个 XML 模式,用于检查整个文档并包括对价格标签值的范围限制:

#!/bin/bash

LIMIT=$1

cat << EOF > data.xsd
<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="data">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="price">
            <xsd:simpleType>
                <xsd:restriction base="xsd:decimal">
                    <xsd:maxInclusive value="$LIMIT"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
EOF

xmllint --schema data.xsd data.xml

运行如下:

$ ./validate.sh 6.5
<?xml version="1.0"?>
<data>
    <price>10.50</price>
    <price>5.50</price>
</data>
data.xml:2: element price: Schemas validity error : Element 'price': [facet 'maxInclusive'] The value '10.50' is greater than the maximum value allowed ('6.5').
data.xml:2: element price: Schemas validity error : Element 'price': '10.50' is not a valid value of the local atomic type.
data.xml fails to validate
于 2013-01-01T12:42:08.033 回答