0

NAME="CONTENTTYPE" を使用してすべての処理命令を読み取る必要があり、@VALUE を読み取ってすべての値を連結し、XQuery/XPath で返す必要があります。

私のXML:

<REG >
    <MARKER MRKEID="SLREG:7.1" MRKTYPE="LD DU" MRKDATE="20130909" MRKTIME="10402688"/>
    <?METADATA NAME="CONTENTTYPE" VALUE="STATUTE"?>
    <?METADATA NAME="CONTENTTYPE" VALUE="LEGISLATIVEDOCUMENT"?>
    <?METADATA NAME="CONTENTTYPE" VALUE="PRIMARYSOURCE"?>
    <?METADATA NAME="SLTAXTYPE" VALUE="PRIMARYSOURCE"?>
</REG>

期待される出力:

STATUTE
LEGISLATIVEDOCUMENT
PRIMARYSOURCE

上記の出力を取得するための XQuery/XPath の作成にご協力ください。

前もって感謝します。

よろしく、 ハリ

4

2 に答える 2

0

JDOM でタグ付けすると、これを見つけるのに役立ちました。

長い答えが来ています.... XPathには、ProcessingInstructionsに「属性」を追加する「標準」の方法を解析するネイティブ機能がありません。単一の XPath 式の一部として値の連結を行いたい場合は、運が悪いと思います....実際、マーティンの答えは有望に見えますが、ProcessingInsructions ではなく、多くの文字列値を返します。JDOM 2.x では、XPath.compile(...) で Filters.string() が必要になり、List<String>path.evaluate(doc) の結果が得られます。XPath の外で行う方が簡単だと思います。 . 特に、JDOM 2.x で Saxon ライブラリを使用することによる XPath2.0 のサポートは限定的であることを考えると

プログラムでそれを行うことに関しては、JDOM 2.x がかなり役立ちます。XML の例を取り上げて、2 つの方法で行いました。最初の方法では、XPath 結果セットでカスタム フィルターを使用します。2 番目の方法は効果的に同じことを行いますが、PI をループ内でさらに制限します。

public static void main(String[] args) throws Exception {
    SAXBuilder saxb = new SAXBuilder();
    Document doc = saxb.build(new File("data.xml"));

    // This custom filter will return PI's that have the NAME="CONTENTTYPE" 'pseudo' attribute...
    @SuppressWarnings("serial")
    Filter<ProcessingInstruction> contenttypefilter = new AbstractFilter<ProcessingInstruction>() {

        @Override
        public ProcessingInstruction filter(Object obj) {
            // because we know the XPath expression selects Processing Instructions
            // we can safely cast here:
            ProcessingInstruction pi = (ProcessingInstruction)obj;
            if ("CONTENTTYPE".equals(pi.getPseudoAttributeValue("NAME"))) {
                return pi;
            }
            return null;
        }

    };

    XPathExpression<ProcessingInstruction> xp = XPathFactory.instance().compile(
            // search for all METADATA PI's.
            "//processing-instruction('METADATA')",
            // The XPath will return ProcessingInstruction content, which we
            // refine with our custom filter.
            contenttypefilter);

    StringBuilder sb = new StringBuilder();
    for (ProcessingInstruction pi : xp.evaluate(doc)) {
        sb.append(pi.getPseudoAttributeValue("VALUE")).append("\n");
    }
    System.out.println(sb);
}

この2番目の方法は、より単純で事前定義されたものを使用Filters.processingInstruction()しますが、追加のフィルタリングを手動で行います....

public static void main(String[] args) throws Exception {
    SAXBuilder saxb = new SAXBuilder();
    Document doc = saxb.build(new File("data.xml"));

    XPathExpression<ProcessingInstruction> xp = XPathFactory.instance().compile(
            // search for all METADATA PI's.
            "//processing-instruction('METADATA')",
            // Use the pre-defined filter to set the generic type
            Filters.processinginstruction());

    StringBuilder sb = new StringBuilder();
    for (ProcessingInstruction pi : xp.evaluate(doc)) {
        if (!"CONTENTTYPE".equals(pi.getPseudoAttributeValue("NAME"))) {
            continue;
        }
        sb.append(pi.getPseudoAttributeValue("VALUE")).append("\n");
    }
    System.out.println(sb);
}
于 2013-10-25T13:50:41.457 に答える