3

この質問は、インターウェブのどこか暗い奥地で以前に答えられたかもしれませんが、それを検索するための意味のある Google クエリを作成する方法さえ理解できませんでした。

次のような (簡略化された) XML ドキュメントがあるとします。

<root>
  <tag1>Value</tag1>
  <tag2>Word</tag2>
  <tag3>
    <something1>Foo</something1>
    <something2>Bar</something2>
    <something3>Baz</something3>
  </tag3>
</root>

標準的な使用例で、JAXB を使用してこれを Java オブジェクトにアンマーシャリングする方法を知っています。

どうすればよいかわからないのは、tag3のコンテンツを文字列にアンマーシャリングすることです。つまり、

<something1>Foo</something1>
<something2>Bar</something2>
<something3>Baz</something3>

文字列、タグ、およびすべてとして。

4

2 に答える 2

1

アノテーション @XmlAnyElement を使用します。私は同じ解決策を探していましたが、DOMの解析を妨げてそのまま生きる注釈を見つけることを期待していましたが、見つかりませんでした。

詳細: Using JAXB to extract inner text of XML element and http://blog.bdoughan.com/2011/04/xmlanyelement-and-non-dom-properties.html メソッド getElement() に 1 つのチェックを追加しました。 IndexOutOfBoundsException を取得できます

if (xml.indexOf(START_TAG) < 0) {
    return "";
}

私にとって、このソリューションでは非常に奇妙な動作です。メソッド getElement() は、xml のすべてのタグに対して呼び出されます。最初の呼び出しは「Value」、2 番目の呼び出しは「ValueWord」などです。前のタグに次のタグを追加します。

更新: このアプローチは、文字列に解析したいタグの 1 つの出現に対してのみ機能することに気付きました。次の例を正しく解析することは不可能です。

<root>
<parent1>
    <tag1>Value</tag1>
    <tag2>Word</tag2>
    <tag3>
        <something1>Foo</something1>
        <something2>Bar</something2>
        <something3>Baz</something3>
    </tag3>
</parent1>
<parent2>
    <tag1>Value</tag1>
    <tag2>Word</tag2>
    <tag3>
        <something1>TheSecondFoo</something1>
        <something2>TheSecondBar</something2>
        <something3>TheSecondBaz</something3>
    </tag3>
</parent2>

親タグ「parent2」を持つ「tag3」には、(TheSecondFoo、TheSecondBar、TheSecondBaz) の代わりに最初のタグ (Foo、Bar、Baz) からのパラメーターが含まれます。ありがとう。

于 2013-04-17T06:20:21.957 に答える
-1

その場合に役立つユーティリティメソッドがあります。それが役立つかどうかを確認してください。あなたの例でサンプルコードを作成しました:

public static void main(String[] args){
    String text= "<root><tag1>Value</tag1><tag2>Word</tag2><tag3><something1>Foo</something1><something2>Bar</something2><something3>Baz</something3></tag3></root>";
    System.out.println(extractTag(text, "<tag3>"));

}

public static String extractTag(String xml, String tag) {
    String value = "";
    String endTag = "</" + tag.substring(1);

    Pattern p = Pattern.compile(tag + "(.*?)" + endTag);
    Matcher m = p.matcher(xml);

    if (m.find()) {
        value = m.group(1);
    }

    return value;
}
于 2013-04-15T16:37:54.727 に答える