将HTML代码段嵌入XML文档中,并根据架构进行验证

时间:2009-04-09 11:36:10

标签: xml xhtml xsd

基本上我想在一个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 /架构经验而且我继承了这个项目,任何建议都会受到欢迎!

提前致谢!

4 个答案:

答案 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中,您可能还想更改该混合内容类型。