在使用命名空间时,我尝试了无数种方法从 Python 的 SAX 解析器中获取属性值,但找不到方法。这里一定有一个简单的解决方案,但我无法确定它。我有一个相当简单的 XML,它利用了其中的名称空间。通过 DOM 解析获取这些数据很容易,但我正在尝试创建一个 SAX 解析器。这是 XML:
<?xml version="1.0" encoding="UTF-8"?>
<cdf:Benchmark style="1.2" resolved="1" xmlns:cdf="http://checklists.nist.gov/xccdf/1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/">
<cdf:TestResult end-time="2024-06-14T17:55:55" id="test_id1" start-time="2024-06-14T17:55:53">
<cdf:rule-result idref="rule_1" role="full" time="2024-06-14T17:55:53">
<cdf:result>pass</cdf:result>
<cdf:message severity="info">Result: true</cdf:message>
</cdf:rule-result>
<cdf:rule-result idref="rule_2" role="full" time="2024-06-14T17:55:54">
<cdf:result>fail</cdf:result>
<cdf:message severity="info">Result : false</cdf:message>
</cdf:rule-result>
</cdf:TestResult>
</cdf:Benchmark>
这是获取“idref”属性值的简单尝试。我还尝试使用 get() 和 getValue() 与无数的命名空间组合,但没有任何效果。我收到一个 KeyError,指出“idref”不是有效的密钥。这是我的代码:
import xml.sax
class CustomHandler(xml.sax.ContentHandler):
def startElementNS(self, name, qname, attrs):
(cdf, self.localname) = name
if self.localname == 'rule-result':
attributes = attrs['idref']
print(attributes)
def characters(self, content):
if self.localname == 'rule-result':
self.rule_result = content
def endElementNS(self, name, qname):
(cdf, self.localname) = name
if self.localname == 'rule-result':
print(self.rule_result)
self.localname = ''
handler = CustomHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
parser.setFeature(xml.sax.handler.feature_namespaces, True)
parser.parse('test_xml_ns.xml')
如有任何帮助,我们将不胜感激!
attrs
是一个 AttributesNSImpl
对象。键是 (namespaceURI, localname)
元组。
只要你改变,它就会起作用
attrs['idref']
到
attrs[(None, 'idref')]