使用Xsd验证或忽略Xml中的Html元素

时间:2014-03-15 01:20:31

标签: html xml validation xsd

我遇到这个问题,我在我的一些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元素或完全忽略节点的信息吗?

谢谢

1 个答案:

答案 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);等