Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSD中的子元素和名称空间_Xml_Validation_Xsd_Xerces - Fatal编程技术网

Xml XSD中的子元素和名称空间

Xml XSD中的子元素和名称空间,xml,validation,xsd,xerces,Xml,Validation,Xsd,Xerces,我一直在试图弄清楚如何在将XML文件加载到应用程序中时使用XML模式来验证XML文件。我已经让该部分正常工作了,但我似乎无法让模式识别除根元素之外的任何有效元素。例如,我有以下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/ha

我一直在试图弄清楚如何在将XML文件加载到应用程序中时使用XML模式来验证XML文件。我已经让该部分正常工作了,但我似乎无法让模式识别除根元素之外的任何有效元素。例如,我有以下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="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>

此XSD正确验证:


此XSD正确验证:



那么,将所有这些元素放在文档的根目录中是否是“正确的”/可接受的做法?首先看它似乎有点可笑。您可以同样轻松地在“fun”元素中指定“activity”元素(而不是使用“ref”属性):但是,如果您的模式变得更复杂,您可能更喜欢像上面那样分解定义。这两种方法都是“正确的/被接受的”。但是,如果我按照您在这篇评论中的建议去做,它会再次中断,并显示与之前相同的错误消息。我完全困惑不解。我觉得我缺少了一些基本的东西。将elementFormDefault=“qualified”添加到schema元素()中,您就可以开始了。伯尼埃:一(1)个互联网给你。那么,把所有这些元素放在文档的根目录中是“正确的”//被接受的事情吗?首先看它似乎有点可笑。您可以同样轻松地在“fun”元素中指定“activity”元素(而不是使用“ref”属性):但是,如果您的模式变得更复杂,您可能更喜欢像上面那样分解定义。这两种方法都是“正确的/被接受的”。但是,如果我按照您在这篇评论中的建议去做,它会再次中断,并显示与之前相同的错误消息。我完全困惑不解。我觉得我缺少了一些基本的东西。将elementFormDefault=“qualified”添加到schema元素()中,您就可以开始了。伯尼埃:给你一(1)个互联网。
cvc-complex-type.2.4.a: Invalid content was found starting with element 'activity'. One of '{activity}' is expected.
<?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>
DocumentBuilderFactory dbf;
// initialize dbf
dbf.setNamespaceAware(true);
<?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>