0

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

在不知道架构的情况下,命名空间属性语法(合格?,不合格?)的常见用例是什么?

4

3 回答 3

1

后者是正确的,因为架构没有attributeFormDefault="qualified"在根<xs:schema>元素上指定。默认行为 ( attributeFormDefault="unqualified") 是<xs:attribute>嵌套在复杂类型中的声明没有命名空间。如果将其设置为,qualified他们将采用targetNamespace架构的 ,此时您的第一个替代方案将是正确的。

于 2013-01-03T16:59:29.053 回答
0

根据秒。XSD 1.0 规范的3.2.2秒。XSD 1.1 的3.2.2.2,本地属性声明(如示例中的IdName属性的声明)是命名空间限定的,如果

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

否则它们是不合格的(它们的扩展名称具有空命名空间值)。

(请注意,XSD 1.0 为同一部分中的顶级属性声明和本地属性声明提供了 XML 到模式组件的映射;您必须仔细检查所描述的情况。XSD 1.1 更精细地细分了文本,尽量减少混淆。)

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

于 2013-01-03T17:03:50.070 回答
0

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

于 2013-01-03T17:09:42.430 回答