代码之家  ›  专栏  ›  技术社区  ›  prashantgpt91

如何使用多个根元素解析xml

  •  1
  • prashantgpt91  · 技术社区  · 8 年前

    我需要分析两者 var & group 根元素。

    密码

    import xml.etree.ElementTree as ET
    tree_ownCloud = ET.parse('0020-syslog_rules.xml')
    root = tree_ownCloud.getroot()
    

    错误

    xml。etree。元素树。ParseError:文档元素后的垃圾邮件:第17行,第0列

    示例XML

    <var name="BAD_WORDS">core_dumped|failure|error|attack| bad |illegal |denied|refused|unauthorized|fatal|failed|Segmentation Fault|Corrupted</var>
    
    <group name="syslog,errors,">
      <rule id="1001" level="2">
        <match>^Couldn't open /etc/securetty</match>
        <description>File missing. Root access unrestricted.</description>
        <group>pci_dss_10.2.4,gpg13_4.1,</group>
      </rule>
    
      <rule id="1002" level="2">
        <match>$BAD_WORDS</match>
        <options>alert_by_email</options>
        <description>Unknown problem somewhere in the system.</description>
        <group>gpg13_4.3,</group>
      </rule>
    </group>
    

    我试着回答关于stackoverflow的其他几个问题 here ,但没有任何帮助。

    我知道原因,由于它没有被解析,人们通常会尝试黑客。在我看来,在XML中有多个根元素是一个非常常见的用例,ET解析库中必须有一些东西来完成这一点。

    2 回复  |  直到 8 年前
        1
  •  5
  •   Grzegorz Oledzki    8 年前

    如注释中所述,XML文件不能有多个根。就这么简单。

    如果您确实以这种格式接收/存储数据(然后它就不是正确的XML)。你可以考虑用一个假标签来包围你所拥有的东西,例如。

    import xml.etree.ElementTree as ET
    
    with open("0020-syslog_rules.xml", "r") as inputFile: 
      fileContent = inputFile.read()
      root = ET.fromstring("<fake>" + fileContent +"</fake>")
      print(root)
    
        2
  •  3
  •   Michael Kay    8 年前

    实际上,示例数据不是格式良好的XML文档,而是格式良好的XML实体。一些XML解析器可以选择接受实体而不是文档,在XPath 3.1中,您可以使用parse-XML-fragment()函数来解析它。

    解析这样的片段的另一种方法是创建一个包装文档,将其作为外部实体引用:

    <!DOCTYPE wrapper [
    <!ENTITY e SYSTEM "fragment.xml">
    ]>
    <wrapper>&e;</wrapper>
    

    然后将此包装器文档作为输入提供给XML解析器。