Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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多模式位置_Xml_Xsd_Schema - Fatal编程技术网

XML多模式位置

XML多模式位置,xml,xsd,schema,Xml,Xsd,Schema,我有一个XSD模式,但我需要它在两个可能的位置-一个用于开发(即我的PC和一个用于生产) 是否有一个简单的机制来实现这一点。例如,XML的开发将是: <?xml version="1.0" encoding="utf-8"?> <Request xmlns="http://www.example.com/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaL

我有一个XSD模式,但我需要它在两个可能的位置-一个用于开发(即我的PC和一个用于生产)

是否有一个简单的机制来实现这一点。例如,XML的开发将是:

<?xml version="1.0" encoding="utf-8"?>
<Request xmlns="http://www.example.com/xml"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://dev.example.com/ Request.xsd\">
  <GetLocations />
</Request>

问题是如何确保XSD文件拾取正确的
include
文件。我有两个模式副本。一个用于生产,另一个用于添加额外内容。

除非您分析XSD文件以查找
schemaLocation
属性,否则PHP脚本将不知道include在哪里,这可能是错误的或者可能不在那里,因为它是完全可选的


将架构导入另一个架构时,不需要提供架构的路径。大多数XSD验证器将在相同的/子文件夹中查找命名空间与import语句匹配的任何XSD文件。有些甚至会完全忽略schemaLocation属性。

解释
schemaLocation
的行为:(XML)与驻留在同一文件夹中的XSD文件配对(除非您指定了完整的文件路径/URL)

现在,在您的示例中,如果您通过XML解析器加载XML,则会出现schemaLocation,其中每对中的第一个URI引用是名称空间名称,第二个是描述该名称空间的模式的位置


如果将XML加载为Doc并根据提供完整路径的XSD文件进行验证,
schemaLocation
将被覆盖。

如果架构保持不变,则可以将其托管在公共位置,提供其绝对URI而不是相对URI,每个人都可以在那里找到它


如果模式发生了变化(您说您正在向模式的开发版本添加“额外的东西”?什么样的东西?)您正在查看XML架构版本控制问题。除了能够找到架构之外,还有更多问题,请参阅以获取一些建议。

导入元素执行与包含元素相同的操作。但是,导入元素允许您访问来自相同/多个架构的组件,这些架构可能属于不同的目标命名空间。 以下是语法:

<import id="ID" namespace="namespace" schemalocation="filename"/>
<include id="ID" schemaLocation="anyURI" any attributes/>

include元素用于包含或引用位于特定地址的外部模式。 以下是语法:

<import id="ID" namespace="namespace" schemalocation="filename"/>
<include id="ID" schemaLocation="anyURI" any attributes/>

include元素允许引用在相同目标命名空间的上下文中定义的任何外部架构。架构的目标命名空间是使用schema元素的targetNamespace属性声明的。include元素中不需要namespace属性,因为包含和不同的模式是相同的

据我所知,@infantpro'aravind'已经解释了SchemaAction行为。
这:

XSD也是如此:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.example.com/xml" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="branch" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
也就是说,它正在寻找
schemaLocation
中指定的
Request.xsd
。相对路径(
c:\windows\system32\inetsrv\
)是服务运行的起点


希望这有帮助。

xsi:schemaLocation
只是一个提示-大多数工具允许您在架构之外指定架构。但这取决于工具-因此如果说出您正在使用的工具,它会有所帮助。@13ren-将使用各种工具。只需要XSD/XML自包含,这样无论使用什么工具。我认为您感到困惑。xsi:schemaLocation中空格前的URL是命名空间URI,不一定是实际位置。如果您使用的是实际的XML文件,并且XSD位于同一文件夹中,则相对路径可能会起作用。@JLRishe-如何确保
我没有使用
的任何经验,但有一种可能的选择n是在执行验证之前(在代码中),修改文档元素的
xsi:schemaLocation
属性或将其添加到文档元素中。对
的处理有可能是特定于实现的,但这可能值得一试。您将获得奖品-其中最有用的答案(尽管我正在做这件事)。将为未来的人更新帖子的结果。我脑子里有一个灯泡:)所以发布。很高兴你发现它很有用,happy SOing:)请在测试完成后发布你的分析!我在.net平台上测试了此行为。不同的平台可能会有所不同。。渴望知道:)不!我只是尝试使用asp.net根据流输入XSD验证流输入XML。我有一个不同的行为,我在答案中更新了我的发现。
<Request xmlns="http://www.example.com/xml"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.example.com/ Request.xsd\">
<?xml version="1.0" encoding="utf-8"?>
<root
  xmlns="http://www.example.com/xml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.example.com/ Request.xsd\">
  <branch>data</branch>
</root>
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.example.com/xml" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="branch" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Cannot load the schema for the namespace 'http://www.example.com/' - Could not find file 'c:\windows\system32\inetsrv\Request.xsd\'.. Line: 1 Column:40