【问题标题】:generating empty xml from schema从架构生成空 xml
【发布时间】:2013-01-03 14:28:58
【问题描述】:

我正在从用户指定的 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 模式 form 属性设置为什么,如果我在 XML DOM 中加载生成的 xml,Name 属性 NamespaceURI 始终为空字符串。 (虽然产品有命名空间)

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

示例差异;

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

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

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      根据 XSD 1.0 规范的 sec. 3.2.2 或 XSD 1.1 的 sec. 3.2.2.2,本地属性声明(如示例中的 Id 和 Name 属性)是命名空间限定的 if

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-08
          • 2019-08-18
          相关资源
          最近更新 更多