【问题标题】:Sub-elements and namespaces in XSDXSD 中的子元素和命名空间
【发布时间】:2010-11-04 22:28:12
【问题描述】:

我一直试图弄清楚如何在将 XML 文件加载到应用程序中时使用 XML Schema 来验证它们。我已经让那部分工作了,但我似乎无法让架构将根元素以外的任何内容识别为有效。例如,我有以下 XML 文件:

<fun xmlns="http://ttdi.us/I/am/having/fun"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://ttdi.us/I/am/having/fun
                          test.xsd">
    <activity>rowing</activity>
    <activity>eating</activity>
    <activity>coding</activity>
</fun>

使用以下(诚然是从可视化编辑器生成的——我不过是凡人)XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">
    <xsd:element name="fun" type="activityList"></xsd:element>

    <xsd:complexType name="activityList">
        <xsd:sequence>
            <xsd:element name="activity" type="xsd:string" maxOccurs="unbounded" minOccurs="0"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

但是现在,使用 Eclipse 的内置(基于 Xerces?)验证器,我收到以下错误:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'activity'. One of '{activity}' is expected.

那么我该如何修复我的 XSD 以使其……正常工作?到目前为止,我看到的所有搜索结果似乎都在说“……所以我刚刚关闭了验证”或“……所以我刚刚摆脱了命名空间”,这不是我想做的事情。

附录:

现在假设我将架构更改为:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">
    <xsd:element name="activity" type="xsd:string"></xsd:element>

    <xsd:element name="fun">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="activity" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

现在它可以工作了,但是这种方法是否意味着我可以在文档的根目录中包含&lt;actvity&gt;?如果ref 应该按原样替换,那么为什么我不能用name="activity" type="xsd:string" 替换ref="actvity"

附加附录:始终这样做,否则您将花费​​数小时将头撞到墙上:

DocumentBuilderFactory dbf;
// initialize dbf
dbf.setNamespaceAware(true);

【问题讨论】:

    标签: xml validation xsd xerces


    【解决方案1】:

    此 XSD 正确验证 here

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">
    
      <!-- definition of simple element(s) -->
      <xsd:element name="activity" type="xsd:string"></xsd:element>
    
      <!-- definition of complex element(s) -->
      <xsd:element name="fun">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="activity" maxOccurs="unbounded" minOccurs="0"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    
    </xsd:schema>
    

    【讨论】:

    • 那么,将所有这些元素放在文档的根目录中是“正确”/可接受的事情吗?乍一看似乎有点搞笑。
    • 你可以很容易地在 'fun' 元素中指定 'activity' 元素(而不是使用 'ref' 属性): 但是,如果您的模式变得更复杂,您可能更喜欢像上面那样分解定义。这两种方法都是“正确/接受”的。
    • 但是,如果我按照您在此评论中的建议进行操作,它会再次中断,并显示与以前相同的错误消息。我完全不解。我觉得我错过了一些基本的东西。
    • 将 elementFormDefault="qualified" 添加到您的架构元素 (),您应该一切顺利。
    • 先生。伯尼尔:一 (1) 个互联网给你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多