xml到xsd的转换问题

xml到xsd的转换问题,xml,xsd,Xml,Xsd,我想用java验证一个XML 我剩下的唯一问题是试图为一个实际上是对命名空间的引用的属性编写XSD。 无法使用“”,因为不允许使用xmlns作为属性的名称。 有什么想法吗 XML: <header> <abc xmlns="www.example.org"> <user>me</user> </abc> </header> <xs:element name="header

我想用java验证一个XML

我剩下的唯一问题是试图为一个实际上是对命名空间的引用的属性编写XSD。 无法使用“”,因为不允许使用xmlns作为属性的名称。 有什么想法吗

XML

<header>        
<abc xmlns="www.example.org">
<user>me</user>               
</abc>
</header>
<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>
<?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>
<?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>
XSD

<header>        
<abc xmlns="www.example.org">
<user>me</user>               
</abc>
</header>
<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>
<?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>
<?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>

'xmlns'保留为


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

头元素未声明名称空间,因此它将获得“未命名名称空间”。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”名称空间

模式生成实用程序生成了两个相互导入的模式(如下)

示例XML文档根据这些模式进行验证(因为它们都相互导入,所以在调用验证时可以引用其中一个)

第一个模式文件sampleSchema.xsd

<header>        
<abc xmlns="www.example.org">
<user>me</user>               
</abc>
</header>
<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>
<?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>
<?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>

第二个架构文件示例.xsd

<header>        
<abc xmlns="www.example.org">
<user>me</user>               
</abc>
</header>
<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>
<?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>
<?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>


我认为我不明白您在这里试图做什么。xsd是否应该以某种方式强制文档声明特定的命名空间?我需要知道xsd应该是什么,以便XML进行验证。我不在乎XML代表什么,它总是以同样的方式硬编码。我似乎无法编写一个没有war的xsd因为这个名称空间属性,我需要知道XSD应该是什么,才能验证XML。我不在乎XML代表什么,它总是以同样的方式硬编码。因为这个名称空间属性,我似乎无法编写没有警告的XSD。