xsd2code 元素命名空间前缀问题

Posted

技术标签:

【中文标题】xsd2code 元素命名空间前缀问题【英文标题】:xsd2code element namespace prefix issue 【发布时间】:2014-12-26 22:50:50 【问题描述】:

我正在使用 xsd2code VS 插件从几个 xsd 文件创建一些数据类,但我遇到了一个问题,即 XSD 中元素的命名空间前缀没有出现在生成的 XML 文件中。

XSD:

<xsd:complexType name="ProductMasterItemType">
  <xsd:sequence>
    <xsd:element ref="cmn:PrimaryItemCode"/>
    <xsd:element ref="cmn:NewPrimaryItemCode" minOccurs="0"/>
    <xsd:element ref="cmn:ProductGroupCode"/>
    <xsd:element ref="cmn:ProductStatus"/>
    <xsd:element ref="cmn:EffectiveDate" minOccurs="0"/>
    <xsd:element ref="cmn:RecordStatus"/>
    <xsd:element name="AlternateItemCodes"
                 type="cmn:AlternateItemCodeListType" 
                 minOccurs="0"/>
    <xsd:element name="TargetMarketList" 
                 type="mdx:TargetMarketListType" 
                 minOccurs="0"/>
    <xsd:element name="ItemInfoList" 
                 type="mdx:ItemInfoListType"/>
    <xsd:element name="PackagingInfoList" 
                 type="mdx:PackagingInfoListType" 
                 minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>

生成的 XML:

<ProductMasterItem>

  <PrimaryItemCode xmlns="urn:tracelink:mapper:sl:mdx:commontypes">
    <type>INTERNAL_MATERIAL_CODE</type>
    TestBOM5
  </PrimaryItemCode>  
  <ProductGroupCode xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
    >100</ProductGroupCode>
  <ProductStatus xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
    >Released</ProductStatus>
  <RecordStatus xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
    >Active</RecordStatus>
  <TargetMarketList>        
    <TargetMarket>
      <CountryMarket 
        xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >US</CountryMarket>
    </TargetMarket>
    <DeleteTargetMarket/>
  </TargetMarketList>
  <ItemInfoList>
    <ItemInfo>
      <LanguageCode xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >EN</LanguageCode>
      <ProductDescription 
        xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >Test BOM 5</ProductDescription>
      <DrugName xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >Nameofadrug</DrugName>
      <Manufacturer xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >- No Manufacturer -</Manufacturer>
      <Strength xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >verystrong</Strength>
      <DosageForm xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >15ml</DosageForm>
      <PackageSize xmlns="urn:tracelink:mapper:sl:mdx:commontypes"
        >40ml</PackageSize>
    </ItemInfo>
    <DeleteItemInfo/>
  </ItemInfoList>

生成的 XML 没有元素的“cmn”命名空间前缀。运行插件时是否错误地生成了类?这是我需要在插件源代码中更改的内容吗?

我没有太多使用 XML 的经验,因此如果信息不足,我深表歉意。如果我遗漏了您需要知道以帮助回答的内容,请告诉我!在此先感谢:)

【问题讨论】:

您需要显示更多的架构文档。 xsd:schema 元素是什么样的? 【参考方案1】:

xsd:schema 元素有一个名为 elementFormDefault 的属性,该属性确定复杂类型的本地元素是否是命名空间限定的。默认值为“不合格”,这意味着您的元素 AlternateItemCodes、TargetMarketList 等根本不是命名空间限定的。如果将值更改为“qualified”,则本地元素位于架构文档的目标命名空间中,即位于由 xsd:schema 的 targetNamespace 属性标识的命名空间中。

从您的示例看来,您可能没有架构的目标名称空间,并且您可能期望元素采用复杂类型的名称空间;不会的。

【讨论】:

以上是关于xsd2code 元素命名空间前缀问题的主要内容,如果未能解决你的问题,请参考以下文章

重命名元素的 XSLT 问题——更改命名空间

XSLT 将命名空间前缀添加到元素最佳实践

JAXB:需要所有元素的命名空间前缀

添加带有前缀的开始元素,没有命名空间

将命名空间前缀添加到根节点

使用 Microsoft.xmldom 更改 XML 元素的命名空间前缀,以便利用 GetElementsByTagName