从模式生成空xml

从模式生成空xml,xml,xsd,Xml,Xsd,我正在从用户指定的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="Produc

我正在从用户指定的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>

在不知道模式的情况下,名称空间属性语法(限定?、非限定?)的常见用例是什么?

后者是正确的,因为模式没有在根
元素上指定
attributeFormDefault=“qualified”
。默认行为(
attributeFormDefault=“unqualified”
)是嵌套在复杂类型中的
声明没有名称空间。如果将其设置为
qualified
,他们将采用模式的
targetNamespace
,此时您的第一个备选方案是正确的。

根据XSD 1.0规范或XSD 1.1的本地属性声明(如示例中的
Id
Name
属性的声明)如果

  • 他们的
    xsd:attribute
    声明具有
    form=“qualified”
    ,或者
  • 它们的
    xsd:attribute
    声明没有
    form
    属性,并且所包含的
    xsd:schema
    元素具有
    attributeFormDefault=“qualified”
否则它们是非限定的(它们的扩展名称具有空名称空间值)

(请注意,XSD 1.0在同一节中为顶级和本地属性声明提供了XML到架构组件的映射;您必须仔细检查描述的是哪种情况。XSD 1.1对文本进行了更精细的细分,以尽量减少混淆。)


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

我相信这是关于xs:attribute元素上的
form
属性的。如果
from
属性值是
限定的
,则架构描述的属性需要加前缀(即属于名称空间),否则不能加前缀。如果缺少
form
属性,则该值来自xs:schema元素上的
attributeFormDefault
。如果未指定此属性,则其默认值为
unqualified
。转到并搜索“attributeFormDefault”以获取所有详细信息。在这种情况下,我认为VS是正确的

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