3

这个问题之前可能已经在 Internet 的某个黑暗的隐蔽处得到了回答,但我什至无法弄清楚如何形成一个有意义的谷歌查询来搜索它。

所以:假设我有一个(简化的)XML 文档,如下所示:

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

我知道如何在标准用例中使用 JAXB 将其解组为 Java 对象。

我不知道该怎么做是将 unmarshaltag3的内容批发成一个字符串。我的意思是:

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

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

4

2 回答 2

1

使用注释@XmlAnyElement。我一直在寻找相同的解决方案,我希望找到一些注释来阻止解析 dom 并保持原样,但没有找到。

详情在: 使用 JAXB 提取 XML 元素的内部文本http://blog.bdoughan.com/2011/04/xmlanyelement-and-non-dom-properties.html 我在方法 getElement() 中添加了一个检查,否则我们可能会得到 IndexOutOfBoundsException

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

对我来说,这个解决方案的行为很奇怪。为您的 xml 的每个标签调用方法 getElement()。第一个调用是针对“Value”,第二个调用是针对“ValueWord”等。它为上一个附加了下一个标签

更新: 我注意到这种方法仅适用于我们要解析为字符串的标记的一次出现。无法正确解析以下示例:

<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)的参数。任何建议表示赞赏。谢谢。

于 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 回答