2013-01-03 51 views
0

我从用户指定的XML模式生成一个空的XML,但我混淆了属性上的名称空间声明。从模式生成空的XML

例如,对于这种模式;

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://tempuri.org/Product" 
      targetNamespace="http://tempuri.org/Product"> 
    <xs:complexType name="ProductType"> 
     <xs:sequence>    
     </xs:sequence> 
     <xs:attribute name="Id" type="xs:string" /> 
     <xs:attribute name="Name" type="xs:string" /> 
    </xs:complexType> 
    <xs:element name="Product" type="ProductType" /> 
</xs:schema> 

我已经生成了这个;

<root> 
    <Product xmlns="http://tempuri.org/Product" 
      xmlns:ns1="http://tempuri.org/Product" 
      ns1:Id="1" 
      ns1:Name="2" /> 
</root> 

但是visual studio产生这个;

<root> 
    <Product xmlns="http://tempuri.org/Product" 
      Id="1" 
      Name="2" /> 
</root> 

哪一个是正确的?

更新1:

无论XML架构形式属性设置为,如果我加载XML DOM生成的XML,名称属性的namespaceURI总是空的字符串。 (虽然产品有命名空间)

我对这些属性执行xpath查询,我无法决定应该始终使用命名空间前缀还是假定它始终与父元素的命名空间相同。

示例差异;

/*/ns1:Product/@Id 
/*/ns1:Product/ns1:@Id 

什么是命名空间属性语法(限定?,不合格?)的常见用例而不知道模式?

回答

1

后者是正确的,因为架构未在根<xs:schema>元素上指定attributeFormDefault="qualified"。缺省行为(attributeFormDefault="unqualified")是嵌套在复杂类型中的<xs:attribute>声明没有名称空间。如果它被设置为qualified,他们将采用模式的targetNamespace,此时您的第一个选择是正确的。

0

按照XSD 1.0规范的sec. 3.2.2,或XSD 1.1 sec. 3.2.2.2,本地属性的声明(像那些在您的示例IdName属性)是合格的命名空间,如果

  • 他们xsd:attribute声明有form="qualified"
  • 它们的xsd:attribute声明没有form属性,并且封闭xsd:schema元素有attributeFormDefault="qualified"

否则它们是不合格的(它们的扩展名称具有空名称空间值)。 (请注意,XSD 1.0为同一节中的顶级和本地属性声明提供了XML到模式组件的映射;您必须小心检查正在描述哪种情况。XSD 1.1将细分文字更加精细,以尽量减少混淆。)

因此,给定您所显示的模式,它是第二个实例,而不是第一个对模式有效的实例。

0

我相信这是关于xs:attribute元素的form属性。如果from属性值为qualified,那么模式描述的属性需要加上前缀(即属于名称空间),否则它不能加前缀。如果缺少form属性,则值来自xs:schema元素上的attributeFormDefault。如果未指定此属性,则默认值为unqualified。请转至Xsd schema spec并搜索“attributeFormDefault”以了解所有详细信息。我会说VS在这种情况下是正确的。