使用命名空间从 Python SAX 解析中获取属性

问题描述 投票:0回答:1

在使用命名空间时,我尝试了无数种方法从 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')

如有任何帮助,我们将不胜感激!

python-3.x xml-parsing attributes xml-namespaces sax
1个回答
0
投票

attrs
是一个
AttributesNSImpl
对象。键是
(namespaceURI, localname)
元组。

只要你改变,它就会起作用

attrs['idref']

attrs[(None, 'idref')]
© www.soinside.com 2019 - 2024. All rights reserved.