[英]how to parse xml with multiple root element
我需要解析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的其他幾個問題,但是沒有一個幫助。
我知道原因,由於它沒有得到解析,所以人們通常嘗試使用hack。 IMO這是一個非常常見的用例,它在XML中具有多個根元素,並且ET解析庫中必須存在某些元素才能完成此操作。
如注釋中所述,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)
實際上,示例數據不是格式良好的XML文檔,而是格式良好的XML實體。 一些XML解析器可以選擇接受實體而不是文檔,並且在XPath 3.1中,您可以使用parse-xml-fragment()函數進行解析。
解析片段的另一種方法是創建一個包裝器文檔,該文檔將其引用為外部實體:
<!DOCTYPE wrapper [
<!ENTITY e SYSTEM "fragment.xml">
]>
<wrapper>&e;</wrapper>
然后將此包裝器文檔提供為XML解析器的輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.