我有一个想要在java中验证的XML。
我唯一的问题是尝试为属性编写XSD,该属性实际上是对命名空间的引用。 无法使用“< xs:attribute name =”xmlns“/>”因为xmlns不允许作为属性的名称。 有什么想法吗?
XML :
<header>
<abc xmlns="www.example.org">
<user>me</user>
</abc>
</header>
XSD :
<xs:element name="header">
<xs:complexType>
<xs:sequence>
<xs:element name="abc">
<xs:complexType> <xs:sequence>
<xs:element name="user" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 0 :(得分:1)
标头元素没有声明名称空间,因此它获取“未命名的名称空间”。 abc 元素中的 xmlns 属性将名称空间声明为www.example.org(没有名称空间前缀)。 “user”元素实际上位于 www.example.org 命名空间中,因为它是“ abc ”元素的子元素,它具有声明的命名空间( xmlns =“www.example.org )。
这两个元素集都没有使用名称空间前缀来消除元素的两个“类型”的歧义,所以当你看它们时会有点混乱。如果您在XML中使用 www.example.org 命名空间的名称空间前缀可能会更清楚,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<header xmlns:example="www.example.org">
<example:abc >
<example:user>me</example:user>
</example:abc>
</header>
上面的XML和您发布的XML是等效的,但是更容易理解哪些元素“属于”“ www.example.org “使用命名空间前缀时的命名空间。
oXygen模式生成实用程序生成了两个相互导入的模式(下面)。
您的示例XML文档会针对这些架构进行验证(因为它们互相导入,您可以在调用验证时引用其中一个)
第一个架构文件 sampleSchema.xsd :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:ns1="www.example.org">
<xs:import namespace="www.example.org" schemaLocation="example.xsd"/>
<xs:element name="header">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns1:abc"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
第二个架构文件 example.xsd :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="www.example.org" xmlns:ns1="www.example.org">
<xs:import schemaLocation="sampleSchema.xsd"/>
<xs:element name="abc">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns1:user"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="user" type="xs:NCName"/>
</xs:schema>
答案 1 :(得分:0)
'xmlns'由Namespaces in XML 1.0保留。
编辑:如果您希望某些元素属于命名空间,则必须在架构中使用此命名空间。