XML验证:验证根元素没有匹配的全局声明

3
我有一个由Cisco提供的IOS XE路由器的XML模式。在路由器的cli中运行命令“show ip access-list test | format”时,它会输出一个XML片段,应该符合此模式的验证。然而,它并没有。相反,我得到了错误消息:“没有匹配的全局声明可用于验证根
以下是由Cisco提供的模式,通过在此处推荐的方式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提取的“show xsd-format cli show ip access-lists”的架构。
<?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>

数据库模式是否有问题?我该如何使其有效验证?

1个回答

4

答案取决于您想更改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不变,请在XSD中添加一个targetNamespace,为该命名空间定义一个命名空间前缀,并在引用该命名空间中的组件时使用该前缀。以下更新后的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片段似乎总是带有命名空间。 - Chris
答案已更新--现在显示如何更改XML 或者 如何更改XSD以实现成功验证。 - kjhughes
对于其他遇到此问题的人,似乎IO-XE路由器使用“| format”CLI命令生成的XML文件无法通过Cisco提供的XSD验证。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接