2013-01-03 50 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在這種情況下是正確的。