xml到xsd的转换问题

时间:2009-08-20 14:17:20

标签: xml xsd

我有一个想要在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>

2 个答案:

答案 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保留。

编辑:如果您希望某些元素属于命名空间,则必须在架构中使用此命名空间。