【问题标题】:XML validation No matching global declaration available for the validation rootXML 验证 没有可用于验证根的匹配全局声明
【发布时间】:2017-04-07 12:10:49
【问题描述】:

我有 Cisco 为 IOS XE 路由器提供的 XML 模式。当运行命令'show ip access-list test | format' 在路由器的 cli 中,它会输出一个 XML 片段,应该针对这个模式进行验证。然而事实并非如此。相反,我收到错误“:没有可用于验证根的匹配全局声明”

Cisco 提供的架构通过运行此处推荐的“show xsd-format cli show ip access-lists”http://www.cisco.com/c/en/us/td/docs/ios-xml/ios/xmlpi/command/xmlpi-cr-book/xmlpi-cr-p1.html#GUID-33CB3BAB-25B4-4FAD-9741-C7AFB483F701 提取,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
    <xsd:complexType name="ShowAccesslists_def">
      <xsd:sequence>
        <xsd:element ref="SpecVersion" minOccurs="0" />
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="Info" />
          <xsd:element name="Access-List" minOccurs="0" maxOccurs="1">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="Type" minOccurs="0" maxOccurs="1" type="xsd:string" />
                <xsd:element name="Name" minOccurs="0" maxOccurs="1" type="xsd:string" />
                <xsd:element name="DenyFilter" minOccurs="0" maxOccurs="1">
                  <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="Filter" minOccurs="0" maxOccurs="1" type="xsd:string" />
                    </xsd:sequence>
                  </xsd:complexType>
                </xsd:element>
                <xsd:element name="PermitFilter" minOccurs="0" maxOccurs="1">
                  <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="Filter" minOccurs="0" maxOccurs="1" type="xsd:string" />
                    </xsd:sequence>
                  </xsd:complexType>
                </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="SpecVersion" type="xsd:string" />
    <xsd:element name="Info" type="xsd:string" />
    <xsd:element name="ShowAccesslists" type="ShowAccesslists_def" />
  </xsd:schema>

路由器吐出的 XML 片段是:

<?xml version="1.0" encoding="UTF-8"?>
   <ShowAccesslists xmlns="ODM://built-in//show_access-lists">
    <Access-List>
      <Type>Extended IP</Type>
      <Name>test</Name>
      <PermitFilter>
        <Filter>10 permit ip any any</Filter>
      </PermitFilter>
      <PermitFilter>
        <Filter>20 permit tcp 0.0.0.1 255.255.255.0 any</Filter>
      </PermitFilter>
      <PermitFilter>
        <Filter>40 permit tcp host 10.22.1.128 10.11.79.0 0.0.0.255 eq domain</Filter>
      </PermitFilter>
      <PermitFilter>
        <Filter>50 permit tcp host 10.22.1.128 eq domain 10.11.79.0 0.0.0.255</Filter>
      </PermitFilter>
    </Access-List>
  </ShowAccesslists>

架构是否损坏?如何让它验证?

【问题讨论】:

    标签: xml xsd cisco cisco-ios


    【解决方案1】:

    答案取决于您是希望更改 XML 还是 XSD...

    更改 XML

    根据您的 XSD,您的 XML 不应位于命名空间中,并且不应包含多个 PermitFilter 元素。

    因此,如果您希望保持 XSD 不变,以下更新的 XML 将成功验证您的 XSD。

    <?xml version="1.0" encoding="UTF-8"?>
    <ShowAccesslists>
      <Access-List>
        <Type>Extended IP</Type>
        <Name>test</Name>
        <PermitFilter>
          <Filter>10 permit ip any any</Filter>
        </PermitFilter>
      </Access-List>
    </ShowAccesslists>
    

    更改 XSD

    您的 XML 位于命名空间中,并且有多个 PermitFilter 元素。

    如果您希望保持 XML 不变,请将 targetNamespace 添加到您的 XSD,为该名称空间定义一个名称空间前缀,并在引用该名称空间中的组件时使用该前缀。以下更新的 XSD 准确显示了如何执行此操作,并将成功验证您的 XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema elementFormDefault="qualified" attributeFormDefault="unqualified" 
                xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                xmlns:sal="ODM://built-in//show_access-lists" 
                targetNamespace="ODM://built-in//show_access-lists">
      <xsd:complexType name="ShowAccesslists_def">
        <xsd:sequence>
          <xsd:element ref="sal:SpecVersion" minOccurs="0" />
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element ref="sal:Info" />
            <xsd:element name="Access-List" minOccurs="0" maxOccurs="1">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="Type" minOccurs="0" maxOccurs="1" type="xsd:string" />
                  <xsd:element name="Name" minOccurs="0" maxOccurs="1" type="xsd:string" />
                  <xsd:element name="DenyFilter" minOccurs="0" maxOccurs="1">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element name="Filter" minOccurs="0" maxOccurs="1" type="xsd:string" />
                      </xsd:sequence>
                    </xsd:complexType>
                  </xsd:element>
                  <xsd:element name="PermitFilter" minOccurs="0" maxOccurs="unbounded">
                    <xsd:complexType>
                      <xsd:sequence>
                        <xsd:element name="Filter" minOccurs="0" maxOccurs="1" type="xsd:string" />
                      </xsd:sequence>
                    </xsd:complexType>
                  </xsd:element>
                </xsd:sequence>
              </xsd:complexType>
            </xsd:element>
          </xsd:choice>
        </xsd:sequence>
      </xsd:complexType>
      <xsd:element name="SpecVersion" type="xsd:string" />
      <xsd:element name="Info" type="xsd:string" />
      <xsd:element name="ShowAccesslists" type="sal:ShowAccesslists_def" />
    </xsd:schema>
    

    【讨论】:

    • 我必须向架构添加什么才能使原始 XML 片段生效?显然要修复多个 PermitFilter 它应该有 macOccurs="unbounded",但我不知道如何添加命名空间。 XML 片段似乎总是与命名空间一起返回。
    • 答案已更新——现在显示如何更改 XML如何更改 XSD 以实现成功验证。
    • 对于其他偶然发现此问题的人来说,IO-XE 路由器生成的 XML 似乎带有 '| format' CLI 命令不针对思科提供的 XSD 进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2021-02-26
    • 2013-02-16
    相关资源
    最近更新 更多