【问题标题】:Why is Oxygen generating child elements with empty xmlns attributes?为什么 Oxygen 会生成具有空 xmlns 属性的子元素?
【发布时间】:2013-05-31 01:08:22
【问题描述】:

我试图掌握使用默认命名空间的技术方面,从模式开始(开发模式)并考虑实际且正确的相应 XML 文件。

我正在使用 Oxygen 来设计架构。

理想情况下,我希望 XML 文件的用户不必处理默认名称空间(因为在尝试对已声明默认名称空间的文档使用 XPath 时,它们会很痛苦)。但是,从我目前阅读的内容来看,这似乎是不可能的?

我的示例架构如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.com/" 
    xmlns="http://www.example.com/">
    <xs:element name="QueryResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Result"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Result">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Patient"/>
            </xs:sequence>
            <xs:attribute name="type" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="VisitNumber" type="xs:string"/>
    <xs:element name="Demographics">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="1" maxOccurs="1" name="firstNames" type="xs:string"/>
                <xs:element minOccurs="1" maxOccurs="1" name="surname" type="xs:string"/>
                <xs:element minOccurs="1" maxOccurs="1" name="dateOfBirth" type="xs:dateTime"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Patient">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Demographics"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

氧气会生成一个示例 XML,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<QueryResponse xmlns="http://www.example.com/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.com/ file:/home/me/simplifiedResponse.xsd">
    <Result>
        <Patient>
            <Demographics>
                <firstNames xmlns="">firstNames0</firstNames>
                <surname xmlns="">surname0</surname>
                <dateOfBirth xmlns="">2006-05-04T18:13:51.0Z</dateOfBirth>
            </Demographics>
        </Patient>
    </Result>
</QueryResponse>

我的问题是:

  1. 为什么 Oxygen 会生成具有空 xmlns 属性的子元素?
  2. 我怎样才能最好地避免这种情况?
  3. 是否可以创建一个模式来正确描述和验证 XML 文档,该文档没有声明的命名空间(默认或其他)。
  4. 如果 (c) 的答案是“是”,您将如何修改我的架构示例
  5. 什么是一个非常好的文档来更深入地解释所有这些,但同时又是可读的(即,我在 http://www.w3.org/XML/ 上找不到任何易于理解或阅读的文档)。

【问题讨论】:

    标签: xml xsd namespaces schema oxygenxml


    【解决方案1】:
    1. 因为有问题的元素不在任何命名空间中。它们不能使用替代前缀,因为不合格的扩展名称只能由不带前缀的名称表示。但它们是使用非空默认命名空间的元素的子元素。因此,它们出现在文档中的唯一方法是清除默认命名空间声明。

    2. 停止将元素声明为不在任何命名空间中。最简单的方法是将elementFormDefault="qualified" 添加到架构元素中。

    3. 是的。

    4. 省略xs:schema 上的targetNamespace 属性。

    5. Google 是你的朋友。

    【讨论】:

    • 您好,感谢您的回答。我一直在玩,并遇到了使用'elementFormDefault="qualified" 的建议,它确实摆脱了空的xmlns 属性。但是,当然,我只能将所有生成的 xml 元素放在默认命名空间中,或者放在真正的命名空间中。因此,为了实现最简单的文档,我想继续前进并尝试您对第 4 点的建议。这导致了氧气的错误。描述:src-resolve.4.2:解析组件“结果”时出错。检测到“结果”在命名空间中......等等等等。
    • 啊.. 我不得不把整个东西放在一个非默认的命名空间中。好的,反复试验,但对我来说没有意义,为什么这是必要的。必须在大海捞针教程中找到难以捉摸的针来澄清它......谷歌并不总是我的朋友。更喜欢一本好书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2023-03-24
    • 2013-02-10
    相关资源
    最近更新 更多