在 XSD 中将 XML 元素设置为无命名空间?
Set XML element to no namespace in XSD?
我正在尝试根据 XSD 验证 XML。在这个 XML 中有带命名空间和不带命名空间的标签。
<my:person xmlns:my="http://my.namespace.com">
<my:name>John Doe</my:name>
<my:year>1988</my:year>
<namespaceLessElement>some value</namespaceLessElement>
</my:person>
我的 XSD 看起来像这样。验证失败,因为根据 XSD,namespaceLessElement
有一个命名空间。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:myNamespace="http://my.namespace.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://my.namespace.com"
elementFormDefault="qualified">
<xs:element name="person" type="myNamespace:person"/>
<xs:complexType name="person">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="year" type="xs:int"/>
<xs:element name="namespaceLessElement" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
我找不到有关如何关闭 namespaceLessElement
命名空间的任何信息。有办法吗?
您 XSD 中定义的所有组件都在其 targetNamespace
定义的命名空间中。 使用 xsd:import 从不同于该命名空间的命名空间引入 XSD:
主要XSD
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:myNamespace="http://my.namespace.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://my.namespace.com"
elementFormDefault="qualified">
<xs:import schemaLocation="namespaceLessElement.xsd"/>
<xs:element name="person" type="myNamespace:person"/>
<xs:complexType name="person">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="year" type="xs:int"/>
<xs:element ref="namespaceLessElement"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
进口XSD
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="namespaceLessElement" type="xs:string"/>
</xs:schema>
那么你的XML,
<?xml version="1.0" encoding="UTF-8"?>
<my:person xmlns:my="http://my.namespace.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://my.namespace.com try.xsd">
<my:name>John Doe</my:name>
<my:year>1988</my:year>
<namespaceLessElement>some value</namespaceLessElement>
</my:person>
将按要求进行验证。
另见
- What's the difference between xsd:include and xsd:import?
我正在尝试根据 XSD 验证 XML。在这个 XML 中有带命名空间和不带命名空间的标签。
<my:person xmlns:my="http://my.namespace.com">
<my:name>John Doe</my:name>
<my:year>1988</my:year>
<namespaceLessElement>some value</namespaceLessElement>
</my:person>
我的 XSD 看起来像这样。验证失败,因为根据 XSD,namespaceLessElement
有一个命名空间。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:myNamespace="http://my.namespace.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://my.namespace.com"
elementFormDefault="qualified">
<xs:element name="person" type="myNamespace:person"/>
<xs:complexType name="person">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="year" type="xs:int"/>
<xs:element name="namespaceLessElement" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
我找不到有关如何关闭 namespaceLessElement
命名空间的任何信息。有办法吗?
您 XSD 中定义的所有组件都在其 targetNamespace
定义的命名空间中。 使用 xsd:import 从不同于该命名空间的命名空间引入 XSD:
主要XSD
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:myNamespace="http://my.namespace.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://my.namespace.com"
elementFormDefault="qualified">
<xs:import schemaLocation="namespaceLessElement.xsd"/>
<xs:element name="person" type="myNamespace:person"/>
<xs:complexType name="person">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="year" type="xs:int"/>
<xs:element ref="namespaceLessElement"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
进口XSD
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="namespaceLessElement" type="xs:string"/>
</xs:schema>
那么你的XML,
<?xml version="1.0" encoding="UTF-8"?>
<my:person xmlns:my="http://my.namespace.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://my.namespace.com try.xsd">
<my:name>John Doe</my:name>
<my:year>1988</my:year>
<namespaceLessElement>some value</namespaceLessElement>
</my:person>
将按要求进行验证。
另见
- What's the difference between xsd:include and xsd:import?