0

BPEL 流程创建一个 xml 文档,一个具有 xml 结构的特定 XSD 文件,我想使用 xmllint 或 xmlstarlet 使用 unix shell 命令行命令解析该 BPEL 变量。这有可能吗?

我如何将 BPEL 变量放入 shell 变量中,以便能够使用 xmllint 解析它?

输入:

<?xml version="1.0"?>
<ns:ItemList xmlns:ns="http:///blabla">
    <GenericItem>
        <ns2:LocalItem xmlns:ns2="http:///blabla">
            <ItemSource> </ItemSource>
            <ConcItemSource>
                <name></name>
                <requirements/>
                <strategy/>
            </ConcItemSource>
            <dataFormat/>
            <directory></directory>
            <file/>
        </ns2:LocalItem>
    </GenericItem>
    <GenericItem>
        <ns2:LocalItem xmlns:ns2="http:///blabla">
            <ItemSource>
            </ItemSource>
            <ConcItemSource>
                <name></name>
                <requirements/>
                <strategy/>
            </ConcItemSource>
            <dataFormat/>
            <directory></directory>
            <file/>
        </ns2:LocalItem>
    </GenericItem>
</ns:ItemList>
4

1 回答 1

0

使用

$ cat bpel.xml
<?xml version="1.0"?>
<ns:ItemList xmlns:ns="http:///blabla">
    <GenericItem>
        <ns2:LocalItem xmlns:ns2="http:///blabla">
            <ItemSource> </ItemSource>
            <ConcItemSource>
                <name></name>
                <requirements/>
                <strategy/>
            </ConcItemSource>
            <dataFormat/>
            <directory>d1</directory>
            <file/>
        </ns2:LocalItem>
    </GenericItem> 
    <GenericItem>
        <ns2:LocalItem xmlns:ns2="http:///blabla">
            <ItemSource>
            </ItemSource>
            <ConcItemSource>
                <name></name>
                <requirements/>
                <strategy/>
            </ConcItemSource>
            <dataFormat/>
            <directory>d2</directory>
            <file/>
        </ns2:LocalItem>
    </GenericItem>
</ns:ItemList>

命令行 :

$ dir1=$(xmlstarlet sel -t -v '//directory[1]/text()' bpel.xml)
$ echo "$dir1"
d1

使用 for 循环:

$ count=$(xmlstarlet sel -t -v 'count(//directory)' bpel.xml)
$ for ((i=1; i<=count; i++)) {
    xmlstarlet sel -t -v "//directory[$i]/text()" bpel.xml >> newfile
}

但你可以简单地做:

$ xmlstarlet sel -t -v "//directory/text()" bpel.xml >> newfile

xmlstarlet 来自STDIN

command_producing_xml | xmlstarlet sel -t -v "//directory/text()" -
于 2014-12-26T03:47:36.520 回答