如何在 XML 中指定名称空间和架构位置?

Kal*_*mar 4 xml xsd xml-namespaces

我的目标是创建一个正确引用描述结构的 XSD 文件的 XML,同时这两个文件都使用命名空间(通过在属性中设置默认命名空间来创建 XML xmlns)。

\n\n

我可以xsi:noNamespaceSchemaLocation在 XML 中指定属性,并且它至少在某些验证器中有效(例如http://www.validome.org/xml/validate/)。但是当我尝试添加命名空间时,验证器返回错误(例如:找不到元素“note”的声明。)

\n\n

我准备的测试文件的最终版本附在下面。我用xmllint类似的方法测试了它:

\n\n
xmllint example.xml --schema example.xsd\n
Run Code Online (Sandbox Code Playgroud)\n\n

它有效,但我在参数中指定了架构位置。我的问题是:XML 文件是否正确引用了 XSD,是否正确使用了命名空间?为什么验证器返回错误?

\n\n

示例.xml:

\n\n
<?xml version="1.0" encoding="UTF-8"?>\n<note\n        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n        xsi:schemaLocation="example.xsd"\n        xmlns="http://example/note"\n>\n        <from>Jacek</from>\n        <to>Agatka</to>\n        <body>Kocham ci\xc4\x99!</body>\n</note>\n
Run Code Online (Sandbox Code Playgroud)\n\n

示例.xsd:

\n\n
<?xml version="1.0" encoding="UTF-8"?>\n<xsd:schema\n       xmlns:xsd="http://www.w3.org/2001/XMLSchema"\n       xmlns="http://example/note"\n       targetNamespace="http://example/note"\n>\n       <xsd:element name="note">\n               <xsd:complexType>\n                       <xsd:sequence>\n                               <xsd:element ref="from"/>\n                               <xsd:element ref="to"/>\n                               <xsd:element ref="body"/>\n                       </xsd:sequence>\n               </xsd:complexType>\n      </xsd:element>\n\n      <xsd:element name="from" type="xsd:string"/>\n\n      <xsd:element name="to" type="xsd:string"/>\n\n      <xsd:element name="body" type="xsd:string"/>\n\n</xsd:schema>\n
Run Code Online (Sandbox Code Playgroud)\n

MiM*_*iMo 5

schemaLocation属性还应该指定名称空间:

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<note\n  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n  xsi:schemaLocation="http://example/note example.xsd"\n  xmlns="http://example/note">\n  <from>Jacek</from>\n  <to>Agatka</to>\n  <body>Kocham ci\xc4\x99!</body>\n</note>\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅此处的文档。

\n