【问题标题】:declaring namespace attribute in XSD element在 XSD 元素中声明命名空间属性
【发布时间】:2016-08-17 03:24:39
【问题描述】:

我在 Eclipse 中使用内置功能从 XSD 生成 XML 文件。 必须按照下面给出的方式生成 XML,并在不同的命名空间下使用“地址簿”。

<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="">

如何为命名空间增加价值?

【问题讨论】:

    标签: xml xsd namespaces attributes


    【解决方案1】:

    XSD 有很多问题,令人惊讶的是,您会从中获取任何 XML:

    1. 命名空间声明不是属性。
    2. 元素 @name 属性值必须是 NCNAME(没有命名空间 前缀)。
    3. 您不能同时拥有命名空间(addressbook 和后代)和 声明的非命名空间(employee、department 等)组件 在单个 XSD 中——您需要使用 xsd:import。

    如果不(至少)对您的 XSD 进行上述修复,您就不能期望从中生成正确的 XML。

    【讨论】:

    • 这很奇怪。我没有声明和导入另一个 XSD 的选项,因为这个模式将成为一个数据库条目。就像,我正在使用第 3 方系统在 UI 上显示这些信息。他们将读取 XML 并显示数据。如果 UI 用户修改了内容,应用程序将从 DB 中获取模式并创建一个具有修改值的新 XML。我不能改变那个系统。所以我唯一的选择是更改 XML 以对所有元素使用默认模式..
    • 如果您的系统不允许您的架构中有两个架构文档,用于不同的命名空间,那么它不允许您拥有多命名空间文档实例,因为 xs:import 是实现这一目标的唯一方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多