2009-04-09 83 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>