【问题标题】:XML Schema for document with two namespaces具有两个命名空间的文档的 XML 模式
【发布时间】:2017-01-05 00:11:30
【问题描述】:

我想准备 .xsd 来验证我收到的 XML 文档。

在定制文档中定义了两个命名空间:

<?xml version="1.0" encoding="UTF-8"?>
    <komunikat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="www.example.com/xml"
        xmlns:nfz="www.example.com/xml/nfz" 

        nfz:version="1.7"
        nfz:info-aplik-nad="KS-PPS 2016.00.3.1">

        type="someType"
        version="4"
    </komunikat>

在我尝试过的架构中:

   targetNamespace="www.example.com/xml"
   xmlns:nfz="www.example.com/xml/nfz"
   ...
   <xs:attribute name="nfz:info-aplik-nad" use="optional" >
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:length value="40" />
        </xs:restriction>
    </xs:simpleType> ...

但在我的验证器中我收到一个错误:

.XMLSchemaParseError: Element '{http://www.w3.org/2001/XMLSchema}attribute', attribute 'name': 'nfz:info-aplik-nad' is not a valid value of the atomic type 'xs:NCName'., line 25

我所理解的 : 字符在 attribute 名称属性中是不允许的。

是否可以不更改 xml 文件?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    只有命名空间中的属性可以在其名称中包含冒号(以指定命名空间前缀)。

    您的 XML 和 XSD 存在许多无关的问题。这是一个完整的、更简单的示例,它显示了一个 XML 实例,该实例对一个属性位于命名空间中的 XSD 有效:

    XML

    <?xml version="1.0" encoding="UTF-8"?>
    <komunikat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns="http://myNameSpace.com" 
               xmlns:nfz="http://myNameSpace.com" 
               nfz:info-aplik-nad="KS-PPS 2016.00.3.1"/>
    

    XSD

    <xs:schema targetNamespace="http://myNameSpace.com" 
               xmlns:m="http://myNameSpace.com"
               xmlns:xs="http://www.w3.org/2001/XMLSchema" 
               attributeFormDefault="qualified" >
      <xs:element name="komunikat">
        <xs:complexType>
          <xs:sequence/>
          <xs:attribute name="info-aplik-nad" use="optional" >
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:length value="18" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    特别注意在 XSD 中使用 attributeFormDefault="qualified"

    为了使用额外的命名空间,您必须拥有额外的 XSD,然后将其导入(使用 xs:import)到主 XSD。

    【讨论】:

    • 感谢您的回答,我能够在 .xml 不变的情况下实现我想要的。现在我有两个.xsd。首先得到mainNameSpace,它用secondaryNameSpace 导入第二个。我使用在第二个.xsd 中定义的属性,使用ref=xmlns:nfz="secondNameSpace" 前缀中定义的属性。我不太清楚attributeFormDefault。但是按照逻辑,当它被限定时,它需要前缀,否则不需要。我在第二个.xsd 中设置了attributeFormDefault="qualified",并在第一个中将ot 设置为默认unqualified。这使我能够成功验证我的.xml。谢谢
    猜你喜欢
    • 2010-10-08
    • 2014-09-17
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2019-03-27
    相关资源
    最近更新 更多