java - JAXB 解码未知 XML 内容的子集

标签 java xml xml-parsing sax jaxb2

我有一个要求unmarshall未知的子集 XML内容,对于未编码的对象,我需要修改一些内容并将相同的 XML 内容(子集)与原始 XML 重新绑定(bind)。

示例输入 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 部分与原始部分绑定(bind),如下所示:

预期输出 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 中是否有任何选项可以做到这一点? ?

请对此提出您的建议。

最佳答案

考虑使用 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 实现中是这样。

关于java - JAXB 解码未知 XML 内容的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796418/

相关文章:

java - 解析带有地理标记数据的 RSS feed

c# - 解析URL/Web服务

java - 如何在Java中有效地删除XML字符串中的直接标签

java - JsonGenerationException : Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)

java - Woodstox stax 和 java stax 冲突

C# 将 XML 数据绑定(bind)到 ListView WPF

Android Intent 信息传递

java - 从保存在sharedPreferences中的Arraylist<object>中删除一个对象

java - 在 Java 中加载时镜像动画 gif - ImageIcon

xml - XTDE0160 : XSLT 1. 0 兼容模式在此配置中不可用/发票的内置模板规则:未命名模式下的请求