【问题标题】:parse xml file and return list of specific variables解析 xml 文件并返回特定变量的列表
【发布时间】:2019-04-24 12:44:20
【问题描述】:

我正在尝试从 xml 文件中提取 X、Y、Z 的列表。 xml的一部分是:

 <Data>
      <TargetPosition X="57.23471787820652" Y="-26.04271457691532" 
Z="9.988092935592704" Valid="1"/> #PosLang
      <StartPosition X="0" Y="0" Z="0" Valid="0"/>
    </Data>
  </Object>
  <Object Type="{aa99a9ec-4b85-442e-b914-de3579656eb5}">
    <ParentTObject Valid="1">
      <Translation X="0" Y="0" Z="0"/>
      <Rotation W="1" X="0" Y="0" Z="0"/>
    </ParentTObject>
    <Data>
      <TargetPosition X="58.81901290773406" Y="-20.09883392050945" 
Z="16.53197054898237" Valid="1"/> #NegLang
      <StartPosition X="0" Y="0" Z="0" Valid="0"/>
    </Data>
  </Object>

我需要从具有 #PosLang 的文件中的所有 TargetPosition 中提取 X、Y、Z 评论

def targets(path='some.xml'):
    try:
        e = ET.parse(path).getroot()
    except FileNotFoundError:
        return list()

    Position = namedtuple('float', ['x', 'y', 'z'])

    for position in e.iter('TargetPosition'):
        yield Position(
            x=float(position.get('X')), 
            y=float(position.get('Y')),
            z=float(position.get('Z'))
        )

在 y 代码中,我提取所有 TargetPosition 的 X、Y、Z,但我只需要具有#PosLang 注释的代码

【问题讨论】:

  • 不要混淆使用 # 和 XML cmets 的 Python cmets。

标签: python xml parsing


【解决方案1】:

如果您的 XML真的 包含字符串 #PosLang 与您的示例显示的完全相同,那么这不是注释,而是常规文本节点。

由于该文本节点位于&lt;TargetPosition&gt; 元素之后,因此它将位于.tail 属性中:

def targets(path='some.xml'):
    try:
        e = ET.parse(path).getroot()
    except FileNotFoundError:
        return list()

    Position = namedtuple('float', ['x', 'y', 'z'])

    for position in e.iter('TargetPosition'):
        if "#PosLang" in position.tail:
            yield Position(
                x=float(position.get('X')), 
                y=float(position.get('Y')),
                z=float(position.get('Z'))
            )

【讨论】:

  • 出现异常:if "#PosLang" in position.tail: ^ TabError: 缩进中制表符和空格的使用不一致
  • 您似乎正在使用制表符来缩进您的 Python 源代码。不要那样做。约定是 Python 缩进是四个空格 - 更新编辑器的设置,使空格可见,修复代码缩进中的错误。
【解决方案2】:

根据the docs,ElementTree 忽略 XML cmets。你能以不同的方式生成 XML 吗?

【讨论】:

  • 问题是生成后要注释掉。因为它应该被标记为“负面”或“正面”
  • 标准是什么?什么时候是“积极的”,什么时候是“消极的”?
  • 启发式地,xml来自神经导航系统,它只产生点,不标记它们,如果人的“语言”反应是积极的,反之亦然
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多