JAXB:将标记作为字符串

时间:2013-04-15 16:31:56

标签: java xml jaxb

这个问题可能已经在Interwebs的一些黑暗的休息时间得到了回答,但我甚至无法弄清楚如何形成一个有意义的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>

作为字符串,标签和所有。

2 个答案:

答案 0 :(得分:1)

使用注释@XmlAnyElement。 我一直在寻找相同的解决方案,我期望找到一些注释,以防止解析dom并按原样实现,但没有找到它。

详细信息: Using JAXB to extract inner text of XML elementhttp://blog.bdoughan.com/2011/04/xmlanyelement-and-non-dom-properties.html 我在方法getElement()中添加了一个cheking,否则我们可以得到IndexOutOfBoundsException

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

对我而言,这个解决方案的行为很奇怪。为xml的每个标记调用方法getElement()。第一个调用是“Value”,第二个调用是“ValueWord”等。它附加了前一个标记

<强>更新 我注意到这种方法仅适用于我们要解析为String的一个标记。无法正确解析followint示例:

<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”将包含来自第一个标记(Foo,Bar,Baz)的参数,而不是(TheSecondFoo,TheSecondBar,TheSecondBaz) 任何建议表示赞赏。 感谢。

答案 1 :(得分:-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;
}