我遇到这个问题,我在我的一些xml文档中声明了html元素,如下所示:
<root>
<someelement />
<messagenode>
<div align="center">
<h3>Title</h3><br />
<p>blah blah blah</p>
Some other comment
<ul>
<li><a href="javascript:self.close();">close me </a></li>
<li><a href="http://stackoverflow.com">go to Stack Overflow</a>/li>
</ul>
</div>
</messagenode>
<otherelement>
</root>
我正在创建一个xsd来验证这个xml文档,但我无法编写验证来验证包含htmlnode的messagenode或忽略该元素下的节点。
我尝试将类型设置为xs:string和xs:anySimpleType,但验证程序仍然将其作为错误返回。我目前无法将配置更改为cdata,因为它们有太多要更改,我不确定使用它的程序是否可以处理更改。
我尝试使用解决方案here,但它仍无效。
有人可以帮我提供有关如何设置xsd以接受html元素或完全忽略节点的信息吗?
谢谢
答案 0 :(得分:1)
根据您尝试做的事情,您显然正在寻找XHTML变体。因此,要强制执行验证,您需要包含适当的XHTML架构以及其他工件。从理论上讲,你的messagenode有几个选项,所以我们只关注这个节点的定义。
要允许文本和标记自由散布,您需要定义混合内容模型,并使用xsd:any作为HTML标记的通配符。
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://someurl.com" xmlns="http://someurl.com" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.w3.org/1999/xhtml" schemaLocation="xhtml1-strict.xsd"/>
<xsd:complexType name="MessageNode" mixed="true">
<xsd:sequence>
<xsd:any processContents="lax" namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="messagenode" type="MessageNode"/>
</xsd:schema>
我最接近的是什么&#34;验证或忽略&#34;您的HTML标记对您意味着...将为您的通配符设置processContents="lax"
;它意味着验证是否提供了XSD,否则忽略。
如果xhtml1-strict.xsd存在(由于div元素上不需要align属性),以下XML基于您的松散,将无法验证,否则将传递。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<messagenode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://someurl.com">
<div align="center" xmlns="http://www.w3.org/1999/xhtml">
<h3>Title</h3>
<br/>
<p>blah blah blah</p>
Some other comment
<ul>
<li>
<a href="javascript:self.close();">close me </a>
</li>
<li>
<a href="http://stackoverflow.com">go to Stack Overflow</a>
</li>
</ul>
</div>
</messagenode>
以上内容应该为您提供有关如何实施解决方案的建议。总结一下,混合内容和使用xsd:any和lax验证是解决方案的关键因素。
如果您不需要div元素之外的文本,则删除mixed属性(默认为false)。如果你想要其他类型的标记(来自其他名称空间的元素),那么删除xsd:any的名称空间属性(默认为## any);等