3

我需要一个unmarshall未知XML内容的子集,使用该未编组的对象,我需要修改一些内容并将相同的 XML 内容(子集)与原始 XML 重新绑定。

示例输入 XML:

<Message>
    <x>
    </x>
    <y>
    </y>
    <z>
    </z>
    <!-- Need to unmarshall this content to "Content" - java Object -->
    <Content>
        <Name>Robin</Name>
        <Role>SM</Role>
        <Status>Active</Status>
    </Content>
.....
</Message>

需要<Content>单独解组标记,保持其他 XML 部分相同。需要修改<Content>tag中的元素,并将修改后的xml部分与原来的绑定,如下图:

预期输出 XML:

<Message>
    <x>
    </x>
    <y>
    </y>
    <z>
    </z>
    <!-- Need to unmarshall this content to "Content" - java Object -->
    <Content>
        <Name>Robin_123</Name>
        <Role>Senior Member</Role>
        <Status>1</Status>
    </Content>
.....
</Message>

我的问题:

  1. 此要求的可能解决方案是什么?DOM解析除外——因为 XML 网络非常庞大)

  2. 有什么选择可以做到这一点JAXB2.0吗?

请就此提出您的建议。

4

2 回答 2

1

考虑使用StAX API将源文档缩小。

对于给定的示例,此代码创建一个带有元素根元素的 DOM 文档Content

class ContentFinder implements StreamFilter {
  private boolean capture = false;

  @Override public boolean accept(XMLStreamReader xml) {
    if (xml.isStartElement() && "Content".equals(xml.getLocalName())) {
      capture = true;
    } else if (xml.isEndElement() && "Content".equals(xml.getLocalName())) {
      capture = false;
      return true;
    }
    return capture;
  }
}

XMLInputFactory inFactory = XMLInputFactory.newFactory();
XMLStreamReader reader = inFactory.createXMLStreamReader(inputStream);
reader = inFactory.createFilteredReader(reader, new ContentFinder());
Source src = new StAXSource(reader);
DOMResult res = new DOMResult();
TransformerFactory.newInstance().newTransformer().transform(src, res);
Document doc = (Document) res.getNode();

然后可以将其作为DOMSource传递给 JAXB

重写输出的 XML 时可以使用类似的技术。

JAXB 似乎不StreamSource直接接受 a,至少在 Oracle 1.7 实现中是这样。

于 2013-05-28T19:16:03.250 回答
0

您可以在类上注释Object属性@XmlAnyElement,默认情况下,未映射的内容将被捕获为 DOM 节点。如果你指定一个DomHandler@XmlAnyElement那么你可以控制格式。这是内容保存为String.

于 2013-05-28T19:02:40.933 回答