我正在从用户指定的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>
但是视觉工作室产生了这个;
<root>
<Product xmlns="http://tempuri.org/Product"
Id="1"
Name="2" />
</root>
哪一个是正确的?
更新1:
无论什么xml架构表单属性设置为,如果我在XML DOM中加载生成的xml,Name属性NamespaceURI始终为空字符串。 (虽然产品具有命名空间)
我正在对这些属性执行xpath查询,我无法决定应该始终使用名称空间前缀还是假设它始终与父元素的名称空间相同。
示例差异;
/*/ns1:Product/@Id
/*/ns1:Product/ns1:@Id
在不知道架构的情况下,命名空间属性语法(限定?,不合格?)的常见用例是什么?
答案 0 :(得分:1)
后者是正确的,因为架构未在根attributeFormDefault="qualified"
元素上指定<xs:schema>
。默认行为(attributeFormDefault="unqualified"
)是嵌套在复杂类型中的<xs:attribute>
声明没有命名空间。如果它设置为qualified
,则会采用模式的targetNamespace
,此时您的第一个选择是正确的。
答案 1 :(得分:0)
根据XSD 1.0规范的sec. 3.2.2或XSD 1.1的sec. 3.2.2.2,本地属性声明(如示例中Id
和Name
属性的声明如果
xsd:attribute
声明有form="qualified"
或xsd:attribute
声明没有form
属性,封闭的xsd:schema
元素有attributeFormDefault="qualified"
。否则它们是不合格的(它们的扩展名称具有空命名空间值)。
(请注意,XSD 1.0在同一部分中为顶级和本地属性声明提供XML到模式组件映射;您必须小心检查正在描述的是哪种情况.XSD 1.1细分文本更精细,试图减少混乱。)
因此,给定您显示的模式,它是对模式有效的第二个实例,而不是第一个实例。
答案 2 :(得分:0)
我相信这是关于xs:attribute元素的form
属性。如果from
属性值为qualified
,则架构描述的属性需要加前缀(即属于命名空间),否则不得加前缀。如果缺少form
属性,则值来自xs:schema元素上的attributeFormDefault
。如果未指定,则此属性的默认值为unqualified
。转到Xsd schema spec并搜索“attributeFormDefault”以获取所有详细信息。在这种情况下我会说VS是对的。