如何使用RELAX NG验证Google购物XML?

时间:2013-06-05 16:52:11

标签: php xml validation relaxng

我尝试使用RELAX NG结构验证xmls。

我曾尝试过像这样的变体:

<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element name="rss" version="2.0" xmlns:g="http://base.google.com/ns/1.0">
            <element name="channel">
                <element name="title">
                    <data type="token"/>
                </element>

                <element name="description">
                    <data type="token"/>
                </element>

                <element name="link">
                    <data type="anyURI"/>
                </element>

                <oneOrMore>
                    <element name="item">
                        <element name="g:id">
                            <data type="long"/>
                        </element>

                        <element name="title">
                            <data type="token"/>
                        </element>

第一个问题是解释标签&#34; g:id&#34;,例如,我解决了把 xmlns:g =&#34; http://base.google.com/ns rss 元素中的/1.0"

但正如我们在manual所看到的那样,我们还需要在rss元素标记处加上 version =&#34; 2.0&#34; 。但是,如果我尝试使用

<element name="rss" version="2.0" xmlns:g="http://base.google.com/ns/1.0">

我收到错误:

PHP Warning:  DOMDocument::relaxNGValidate(): Unknown attribute version on element in ...

如果我使用

<element name="rss" xmlns:g="http://base.google.com/ns/1.0">

我没有错误,但手册需要 version =&#34; 2.0&#34;

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我找到了自己的解决方案

以下示例:

<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element name="rss" xmlns:g="http://base.google.com/ns/1.0">
            <attribute name="version">
                <data type="decimal"/>
            </attribute>
            <element name="channel">
                <element name="title">
                    <data type="token"/>
                </element>

                <element name="description">
                    <data type="token"/>
                </element>

                <element name="link">
                    <data type="anyURI"/>
                </element>

                <oneOrMore>
                    <element name="item">
                        <element name="g:id">
                            <data type="long"/>
                        </element>

                        <element name="title">
                            <data type="token"/>
                        </element>