JAXB解组未知XML内容的子集

时间:2013-05-28 15:54:51

标签: java xml xml-parsing sax jaxb2

我要求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>标记中的元素,并将修改后的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 contnet非常庞大)

  2. JAXB2.0

  3. 中是否可以选择执行此操作?

    请就此提出建议。

2 个答案:

答案 0 :(得分: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();

然后可以passed to JAXB作为DOMSource

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

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

答案 1 :(得分:0)

您可以使用Object在类上注释@XmlAnyElement属性,默认情况下,未映射的内容将被捕获为DOM节点。如果您在DomHandler上指定@XmlAnyElement,则可以控制格式。以下是一个示例链接,其中内容保存为String