簡體   English   中英

使用xsd:any用於可擴展模式

[英]using xsd:any for extensible schema

到目前為止,我一直在通過定義具有“name”和“value”屬性的占位符元素來處理擴展 ,如下例所示

<root>
   <typed-content>
      ...
   </typed-content>
   <extension name="var1" value="val1"/>
   <extension name="var2" value="val2"/>
....
</root>

我現在打算切換到使用xsd:any 如果你能幫助我選擇最佳方法,我將不勝感激

  1. 如果我指定processContents =“strict”,xsd:any的值是什么超過我以前的方法
  2. EAI / ESB工具/庫是否可以針對我返回的任意元素執行XPATH表達式
  3. 我看到各種綁定工具在生成綁定代碼時單獨處理它。 如果我在代碼生成時間內包含namespace =“http:// mynamespace”並提供“http:// mynamespace”的架構,這是否相同?
  4. 這是WS-I兼容的嗎?
  5. 我有什么陷阱嗎?

謝謝

  1. 使用<xsd:any processContents="strict">使人們能夠在不更改原始模式的情況向其XML實例文檔添加擴展。 這是它給你帶來的重要好處。
  2. 是。 工具比操縱實例不關心模式是什么樣的,它是他們看到的實例文檔。 對他們來說,如果你使用<xsd:any>並不重要。
  3. 綁定工具通常不能非常優雅地處理<xsd:any> 這是可以理解的,因為它們沒有關於它可能包含什么的信息,所以它們通常會給你一個無類型的占位符。 它是在運行時處理它的應用程序代碼。 JAXB特別(RI,至少)是它的一個拳頭,但它是可行的。
  4. 是。 這是非常好的XML Schema實踐,WS-I支持所有有效的XML Schema
  5. 由於綁定的無類型性質, <xsd:any>使程序員的生活變得更加困難,但如果你需要支持任意擴展點,這就是這樣做的方法。 但是,如果你的擴展名是明確的,並且沒有改變,那么它可能不值得刺激因素。

關於第3點

綁定工具通常不能非常優雅地處理。 這是可以理解的,因為它們沒有關於它可能包含什么的信息,所以它們通常會給你一個無類型的占位符。 它是在運行時處理它的應用程序代碼。 JAXB特別(RI,至少)是它的一個拳頭,但它是可行的。

這對應於JAXB中的@XmlAnyElement批注。 行為如下:

@XmlAnyElement - 將所有內容保存為DOM節點

如果使用此批注對屬性進行批注,則XML文檔的相應部分將保留為DOM節點。

@XMLAnyElement(lax = true) - 將已知元素轉換為域對象

通過設置lax = true ,如果JAXB具有與該QName對應的根類型,則它將該塊轉換為域對象。

暫無
暫無

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

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