【问题标题】:How to parse namespaces using untangle如何使用 untangle 解析命名空间
【发布时间】:2016-07-28 22:17:37
【问题描述】:

我一直在使用 Untangle 库 (https://untangle.readthedocs.org/en/latest/#) 在 Python 中搞乱,以便更轻松地调用 XML 变量。这对我来说非常简单,除非有多个 xml 标题共享相同的名称(如下面的 XML 示例)。在 Perl 中,您可以使用类似下面的示例脚本来轻松解析 XML 文件。我希望像本例那样使用一行来获取某个 XML 变量。即使用 name 属性作为孩子。我打赌 Untangle 在 Python 中做到了这一点,但我还没有弄清楚。

示例 Perl 脚本:

use XML::Simple;
my $XML = "/my/file/path/untest.xml";

my $config = XMLin("$XML", keyattr => { child => 'name'},forcearray => ['child']);

my $instance = 'child1';
my $things = $config->{child}->{$instance}->{thing};

print("the element: $things\n");

示例 XML 文件:

<root>
    <child name="child1">
        <thing>1</thing>
    </child>
    <child name="child2">
        <thing>2</thing>
    </child>
</root>

编辑:编辑了示例 Perl 脚本。这应该有效。

【问题讨论】:

  • Untangle 是否以与 XML::Simple 相同的方式警告您?
  • 那些不是命名空间。它们只是具有相同名称的普通元素(在默认命名空间中)

标签: perl python-2.7 xml-parsing


【解决方案1】:

如果在您的 XML 文档中的同一级别有多个同名元素,则该对象属性的值将是一个 list。这意味着您可以像这样访问问题中的数据

xml = untangle.parse(xml_file)

for child in xml.root.child:
    print "Name:  %s" % child['name']
    print "Thing: %s" % child.thing

【讨论】:

  • 有没有办法在一行中做到这一点,而不是在列表中循环。示例:$config->{child}->{$instance}->{thing};
  • 否,因为那只能显示单个child 元素的详细信息。如果你不能从那里自己解决,那么你必须在你的问题中准确地输入你想要的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2014-01-10
  • 2018-07-15
  • 2012-06-11
  • 2015-09-08
  • 2011-09-20
相关资源
最近更新 更多