2009-04-09 80 views
2

本質上,我想將一些XHTML嵌入到必須根據自定義模式進行驗證的XML文檔中。Emded XHTML片段在XML文檔中,並根據模式驗證

全屏背景:

我有一個消耗XML文檔的web服務。此XML文檔是針對自定義架構進行驗證的。 XML中的數據被解析並存儲在數據庫中,並在網站上以有用的格式顯示。

在我的web服務中激發XML的客戶有自己的內部「IT /程序員人員」。他希望能夠在網站頁面的某些 上的某些佔位符中顯示一些自定義XHMTL。

我們已經同意他可以擴展他在我的web服務中激發的XML以包含3個將包含HTML的新元素,並且我會相應地調整我的模式。 我也會做一些處理,將他的XHTML從XML文檔中移出到網頁上。

我不想使用CDATA因爲這可能是非常不安全的(我認爲),所以我試圖在架構中使用的<xs:any>

<xs:element name="SomeXhtmlStuff" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

我想這將意味着,任何有效的XML在元素中都可以,例如所有的XHTML標籤都可以,但是我試過這個:

<SomeXhtmlStuff> 
    <p>This is a test HTML output for Job Details</p> 
</SomeXhtmlStuff> 

並且XML將不會驗證它。 編輯:Visual Studio 2008在它自動驗證器給出的錯誤「'P'元素沒有聲明」

我沒有太多的經驗與XML /架構,我繼承了這個項目,任何建議將超過歡迎!

在此先感謝!

回答

0

你或許應該考慮把XHTML名成XS:任何元素。您可能還想要將processContents屬性更改爲'lax'。 lax屬性值通知驗證程序,如果它能找到定義,它應驗證內容。所以,更好的元模型可能是:

<xs:element name="SomeXhtmlStuff" minOccurs="0" > 
    <xs:complexType> 
    <xs:complexContent mixed="true"> 
     <xs:restriction base="xs:anyType"> 
     <xs:sequence> 
      <xs:any processContents="lax" 
        namespace="http://www.w3.org/1999/xhtml" 
        minOccurs="0" 
        maxOccurs="unbounded"/> 
     </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 
    </xs:element> 

當然,你也可能要改變這種混合的內容類型,如果他是剛插入元素到您的XML。

0

我相信使用CDATA部分更好。在(X)HTML世界中,碰巧存在具有無效標記的文檔。儘管如此,瀏覽器實際上顯示有用的東西。所以,問題在於你可能不時得到響應,因爲另一端試圖在XML文檔中發送無效的XHTML並停止正常工作。

順便說一下,Atom和RSS發佈商使用CDATA部分插入XHTML/HTML標記。

0

您收到的驗證錯誤是什麼?

我相信<xs:any/>的意思是「任何將驗證的XML」。 <p/>對什麼將進行驗證?

+0

「p元素沒有聲明」是visual studio 2008給我的錯誤。 – bplus 2009-04-09 12:01:05

+0

而且,你是否聲明瞭p元素?有人嗎? – 2009-04-09 12:04:20

0

經過一些google搜索,我發現這個模式片段,這似乎工作:

<xs:element name="SomeXhtmlStuff" minOccurs="0" > 
    <xs:complexType> 
    <xs:complexContent mixed="true"> 
     <xs:restriction base="xs:anyType"> 
     <xs:sequence> 
      <xs:any processContents="skip" 
        minOccurs="0" 
        maxOccurs="unbounded"/> 
     </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 
    </xs:element>