我需要解析var
和& group
根元素。
代码
import xml.etree.ElementTree as ET
tree_ownCloud = ET.parse('0020-syslog_rules.xml')
root = tree_ownCloud.getroot()
错误
xml.etree.ElementTree.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的其他几个问题,但没有人帮忙。
我知道原因,因为它没有得到解析,人们通常会尝试黑客攻击。 IMO在XML中使用多个根元素是一个非常常见的用例,在ET解析库中必须有一些东西才能完成。
答案 0 :(得分:4)
如评论中所述,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)
答案 1 :(得分:3)
实际上,示例数据不是格式良好的XML文档,但它是一个格式良好的XML实体。一些XML解析器可以选择接受实体而不是文档,而在XPath 3.1中,您可以使用parse-xml-fragment()函数解析它。
解析这样的片段的另一种方法是创建一个包装器文档,将其作为外部实体引用:
<!DOCTYPE wrapper [
<!ENTITY e SYSTEM "fragment.xml">
]>
<wrapper>&e;</wrapper>
然后提供此包装器文档作为XML解析器的输入。