1

im seeking a simple method (utility, function, tool) for running boolean logic on data in xml format, and most likely via shell script. this has nothing to do with translating xml or creating other documents but simple logic decisions that permit basic operations <, >, =, !=

lets say given an xml file, 2012_04_21.xml containing (amongst other things) the xml key and value of <data>...<price>6.50</price>...</data>

my ideal tool would be along the lines of:

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

returning either true, false, nothing or something depending on the given logic

grep works well for 'has' or '==' type operation. grep '<key>value</key>' 2012_04_21.xml offers either nothing or the matching string that can be booleanated.

but, grep fails to suffice for reasons: 1. not possible for price > 5.00 2. cannot cope with hierarchies like data/price > 5.00

XPATH logic is completely adequate, but im struggling to come up with a way of harnessing it under this situation.

xsltproc mylogic.xsl 2012-04-21.xml

Hmmm, perhaps a combo of xsltproc mylogic.xsl 2012-04-21.xml | grep true

Ill give that a whirl.

Any other ideas are welcome.

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]特定のタグ コンテンツの XML を (e) grep する方法は?

于 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」コマンドの終了コードをシェル スクリプトで使用して、XML が検証されたかどうかをテストできます。

オプション 2: XML スキーマを生成する

次のシェル スクリプトは、ドキュメント全体をチェックし、値札の値の範囲制限を含む 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 に答える