python - 以编程方式清理/忽略 XML 中的 namespace - python

标签 python xml xml-namespaces elementtree

我正在尝试编写一个简单的程序来从 GNUCash 读取我的财务 XML 文件,并在此过程中学习 Python。

XML 看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<gnc-v2
     xmlns:gnc="http://www.gnucash.org/XML/gnc"
     xmlns:act="http://www.gnucash.org/XML/act"
     xmlns:book="http://www.gnucash.org/XML/book"
     {...}
     xmlns:vendor="http://www.gnucash.org/XML/vendor">
<gnc:count-data cd:type="book">1</gnc:count-data>
<gnc:book version="2.0.0">
<book:id type="guid">91314601aa6afd17727c44657419974a</book:id>
<gnc:count-data cd:type="account">80</gnc:count-data>
<gnc:count-data cd:type="transaction">826</gnc:count-data>
<gnc:count-data cd:type="budget">1</gnc:count-data>
<gnc:commodity version="2.0.0">
  <cmdty:space>ISO4217</cmdty:space>
  <cmdty:id>BRL</cmdty:id>
  <cmdty:get_quotes/>
  <cmdty:quote_source>currency</cmdty:quote_source>
  <cmdty:quote_tz/>
</gnc:commodity>

现在,我可以使用

进行迭代并获得结果
import xml.etree.ElementTree as ET 
r = ET.parse("file.xml").findall('.//') 

在手动清理命名空间之后,但我正在寻找一种解决方案,它可以读取条目而不管它们的命名空间如何,或者在解析之前删除命名空间。

请注意,我是 Python 的完全菜鸟,我读过:Python and GnuCash: Extract data from GnuCash files , Cleaning an XML file in Python before parsingpython: xml.etree.ElementTree, removing "namespaces"连同 ElementTree 文档,我仍然迷路了......

我想出了这个解决方案:

def strip_namespaces(self, tree):

    nspOpen = re.compile("<\w*:", re.IGNORECASE)
    nspClose = re.compile("<\/\w*:", re.IGNORECASE)

    for i in tree:
        start = re.sub(nspOpen, '<', tree.tag)          
        end = re.sub(nspOpen, '<\/', tree.tag)

    # pprint(finaltree)
    return

但我没有应用它。我似乎无法检索文件中显示的标签名称。

最佳答案

我认为下面的 python 代码会对您有所帮助。

示例.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gnc:prodinfo xmlns:gnc="http://www.gnucash.org/XML/gnc"
     xmlns:act="http://www.gnucash.org/XML/act"
     xmlns:book="http://www.gnucash.org/XML/book"
     xmlns:vendor="http://www.gnucash.org/XML/vendor">
    <gnc:change>
        <gnc:lastUpdate>2018-12-21
        </gnc:lastUpdate>
    </gnc:change>
    <gnc:bill>
        <gnc:billAccountNumber>1234</gnc:billAccountNumber>
        <gnc:roles>
            <gnc:id>111111</gnc:id>
            <gnc:pos>2</gnc:pos>
            <gnc:genid>15</gnc:genid>
        </gnc:roles>
    </gnc:bill>
    <gnc:prodtyp>sales and service</gnc:prodtyp>
</gnc:prodinfo>

PYTHON 代码:删除根标记的 xmlns。

import xml.etree.cElementTree as ET

def xmlns(str):
    str1 = str.split('{')
    l=[]
    for i in str1:
        if '}' in i:
            l.append(i.split('}')[1])
        else:
            l.append(i)
    var = ''.join(l)
    return var


tree=ET.parse('sample.xml')
root = tree.getroot()
print(root.tag)   #returns root tag with xmlns as prefix 
print(xmlns(root.tag)) #returns root tag with out xmlns as prefix

输出:

{ http://www.gnucash.org/XML/gnc }产品信息 产品信息

关于python - 以编程方式清理/忽略 XML 中的 namespace - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16640966/

相关文章:

python - hashlib.md5() 类型错误 : Unicode-objects must be encoded before hashing

python - Django 存储 S3 : cname domains?

html - 在 XML 中显示 HTML 标签

XML 文档中带有命名空间的 Javascript XPath

xml - 使用 XSLT 自动生成 XML 模式

python - Django : ModelForm with OneToOneField

java - Python 2 和 Java 1.6 之间的 BadPaddingException AES 128 CBC

c# - 我的应用程序从 xml 文件中读取了过时的数据

c# - 如何在 Windows Phone 8 中实现深度链接

python - XML 和 Python : Get the namespaces declared in root element