在XSD元素中声明命名空间属性

时间:2016-08-17 03:24:39

标签: xml xsd namespaces attributes

我在eclipse中使用内置功能从XSD生成XML文件。 必须如下所示生成XML,并在不同的命名空间下使用“addressbook”。

<employee xmlns:ns2="urn:employees_2014_1.lists.webservices.test.com">
    <department>8029</department>
    <emailAddress>USER_17@something.com</emailAddress>
    <employeeAddressBookList>
        <ns2:addressbook>
            <ns2:addressee>BC</ns2:addressee>
            <ns2:addr1>A1</ns2:addr1>
            <ns2:addr2>A2</ns2:addr2>
            <ns2:city>C1</ns2:city>
            <ns2:state>ST1</ns2:state>
            <ns2:zip>10001</ns2:zip>
        </ns2:addressbook>
    </employeeAddressBookList>
    <employeeId>000001</employeeId>
</employee>

我的XSD如下所示。

    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="employee">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="department" type="xsd:int" />
            <xsd:element name="emailAddress" type="xsd:string" />
            <xsd:element name="employeeAddressBookList">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="ns2:addressbook">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element name="ns2:addressee" type="xsd:string" />
                        <xsd:element name="ns2:addr1" type="xsd:string" />
                        <xsd:element name="ns2:addr2" type="xsd:string" />
                        <xsd:element name="ns2:city" type="xsd:string" />
                        <xsd:element name="ns2:state" type="xsd:string" />
                        <xsd:element name="ns2:zip" type="xsd:int" />
                      </xsd:sequence>
                    </xsd:complexType>
                  </xsd:element>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
            <xsd:element name="employeeId" type="xsd:int" />
          </xsd:sequence>
<xsd:attribute name="xmlns:ns2" type="xs:string" />
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>

这生成了一个没有命名空间值的XML。

<employee xmlns:ns2="">
    <department>8029</department>
    <emailAddress>USER_17@something.com</emailAddress>
    <employeeAddressBookList>
        <ns2:addressbook>
            <ns2:addressee>BC</ns2:addressee>
            <ns2:addr1>A1</ns2:addr1>
            <ns2:addr2>A2</ns2:addr2>
            <ns2:city>C1</ns2:city>
            <ns2:state>ST1</ns2:state>
            <ns2:zip>10001</ns2:zip>
        </ns2:addressbook>
    </employeeAddressBookList>
    <employeeId>000001</employeeId>
</employee>

我在谈论这条线......

<employee xmlns:ns2="">

如何为命名空间添加值?

1 个答案:

答案 0 :(得分:1)

XSD存在很多问题,令人惊讶的是你从中获取了任何XML:

  1. 命名空间声明不是属性。
  2. 元素addressbook属性值必须是NCNAME(没有命名空间) 前缀)。
  3. 你不能同时拥有命名空间(employee和后代)和 声明了非命名空间(departmentxsd:import等)组件 在单个XSD中 - 您需要使用nsMgr.AddNamespace(String.Empty, root.NamespaceURI)
  4. 不对(至少)对XSD进行上述修复,您不能指望从中生成正确的XML。