簡體   English   中英

JAXB解組未知XML內容的子集

[英]JAXB Unmarshalling an subset of Unknown XML content

我需要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>

需要通過將其他XML部分保持相同來單獨解組<Content>標記。 需要修改<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有沒有選擇呢?

請提供您的建議。

考慮使用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 ,至少在Oracle 1.7實現中是這樣。

您可以使用@XmlAnyElement在類上注釋Object屬性,默認情況下,未映射的內容將作為DOM節點捕獲。 如果指定DomHandler@XmlAnyElement那么你可以控制的格式。 以下是一個示例的鏈接,其中內容保存為String

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM