基本上我想在一个XML文档中嵌入一些XHTML,它必须根据自定义模式进行验证。
完整背景:
我有一个使用XML文档的web服务。此XML文档根据自定义架构进行验证。 XML中的数据被解析并存储在数据库中,并以有用的格式显示在网站上。
在我的webservice上激活XML的客户有自己的内部“IT /程序员”。他希望能够在某些占位符上显示一些自定义XHMTL 网站页面。
我们已经同意他可以扩展他在我的webservice上发布的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 :(得分:0)
我相信使用CDATA部分会更好。在(X)HTML的世界中,恰好存在具有无效标记的文档。尽管如此,浏览器实际上显示了有用的东西。所以,问题是您可能不时得到响应,因为另一端试图在XML文档中发送无效的XHTML并且停止正常运行。
顺便说一句,Atom和RSS发布者使用CDATA部分插入XHTML / HTML标记。
答案 1 :(得分:0)
您收到的验证错误是什么?
我相信<xs:any/>
表示“任何将验证的XML”。 <p/>
将对哪些内容进行验证?
答案 2 :(得分:0)
经过一些谷歌搜索后,我发现这个模式片段似乎有效:
<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>
答案 3 :(得分:0)
您应该考虑将xhtml命名空间放入xs:any元素中。您可能还想将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中,您可能还想更改该混合内容类型。