Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
编写XSD以在目标XML中不使用名称空间_Xml_Xsd - Fatal编程技术网

编写XSD以在目标XML中不使用名称空间

编写XSD以在目标XML中不使用名称空间,xml,xsd,Xml,Xsd,如何修改这个XSD模式,使其在XML中不使用名称空间声明来验证XML文件 当候选XML包含相同名称空间的声明时,模式会进行验证,但是如果不必首先编辑候选文档,那么工作流显然会更容易 我肯定我错过了一些简单的东西,但一个小时的猜测并没有扭转局面 模式--data.xsd <schema xmlns=xsd:"http://www.w3.org/2001/XMLSchema" xmlns:target="http://myurl.com/response" targetNamesp

如何修改这个XSD模式,使其在XML中不使用名称空间声明来验证XML文件

当候选XML包含相同名称空间的声明时,模式会进行验证,但是如果不必首先编辑候选文档,那么工作流显然会更容易

我肯定我错过了一些简单的东西,但一个小时的猜测并没有扭转局面

模式--data.xsd

<schema
  xmlns=xsd:"http://www.w3.org/2001/XMLSchema"
  xmlns:target="http://myurl.com/response"
  targetNamespace="http://myurl.com/response"
  elementFormDefault="qualified">
  <xsd:element name="response">
    <xsd:complexType mixed="true" name="response">
      <xsd:all>
        <xsd:element name="item">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:any namespace="##any"
                   processContents="lax"
                   minOccurs="0"
                   maxOccurs="unbounded" /xsd:>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="activities" >
          <xsd:complexType>
            <xsd:sequence>
              <xsd:any namespace="##any"
                   processContents="lax"
                   minOccurs="0"
                   maxOccurs="unbounded" /xsd:>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        <!-- et cetera -->
      </xsd:all>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

提前感谢。

xsd:schema
中删除
targetNamespace
属性。然后还可以删除
elementFormDefault
,因为在没有目标名称空间的情况下,它没有任何区别

在原始模式中,使用
targetNamespace
这样的声明

<xsd:element name="response">

声明一个元素,其本地名称为
response
,命名空间URI为
http://myurl.com/response
。名称空间URI是元素的完全限定名称的一个组成部分,因此模式不会验证具有相同本地名称但具有不同(或空)名称空间的元素


相反,如果删除目标命名空间,则架构将验证非命名空间文档,但不会验证命名空间文档。

Boom。请解释为什么targetNamespace会出现问题。啊。因此,使用{targetNamespace}修改元素的完全限定名,但方式不那么容易看到。我发现这有点令人困惑——模式没有定义名称空间吗?但我想答案是,不,或者至少不是完全。它是为特定名称空间定义结构。但是是否要求受该结构约束的元素已经是该名称空间的一部分是一个选择,这是由targetNamespace的行为所实现的。欢迎来到混乱的名称空间世界。
<?xml version="1.0" encoding="utf-8"?>
<response>
  <item>
    <! -- valid stuff -->
  </item>
  <activities>
    <! -- valid stuff -->
  </activities>
</response>
xmllint --noout --schema data.xsd data.[namespaced.].xml
<xsd:element name="response">