如何使用Python处理xml文件中"<?"注释



有人知道如何用Python处理这种XML注解,这是我第一次看到这个。

&lt;?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd35-f18014fdecf3" resource-id="570935" resource-type="fork" type="ResourceLink"?&gt;

我需要查询这种"元素"来获取resource-uuid值。

感谢大家,我了解了处理指令,并以此研究了如何处理它,如果有人需要它,我会让我划伤:

from lxml import etree
...
file = 'path/to/file.xml'
tree = etree.parse(file)
result = tree.xpath('//processing-instruction("link")')
for pi in result:
    # Each pi is a processing instruction tagged as 'link'
    if pi.get('type').__str__() == 'ResourceImport':
        # PI with type = ResourceImport
        print pi.text # Check the text of tis PI

使用lxml库很容易通过 XPath 获取处理指令。

我希望这个代码片段对因为这个问题而来到这里的人有所帮助。

必须区分处理指令xml 声明

两者都以相同的方式编写:<?SomeName SomeContent ?> .

有关详细信息,请参阅第 2.6 节!

虽然 xml 声明必须排在第一位,并且以 <?xml 开头,但其他处理指令可能(几乎(出现在 XML 中的任何位置。

处理指令必须具有名称,而内容不像元素的内容那样受到正式限制。它是自由文本...

所以这是格式正确的 XML:

<root>
  <a>test</a>
  <?piName some test?>
</root>

我不使用 python,但这会在 SQL-Server 中返回您的 PI:

DECLARE @xml XML=
N'<root>
    <a>test</a>
    <?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd35-f18014fdecf3" resource-id="570935" resource-type="fork" type="ResourceLink"?>
  </root>';
SELECT @xml.query('/root/processing-instruction("link")');

即使您的内容看起来像属性:在 PI 中,内容是自由文本。所以你必须从内容中解析出你的信息......

这个答案可能会对你有所帮助。

如果您的处理器支持 XQuery 3.1,以下是解决问题的一种方法:

declare function local:values($pi) {
  map:merge(
    for $pair in tokenize($pi)
    let $key := substring-before($pair, '=')
    let $value := replace(substring-after($pair, '='), '^"|"$', '')
    return map:entry($key, $value)
  )
};
let $xml := document {
  <xml>
    <?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd35-f18014fdecf3"
      resource-id="570935" resource-type="fork" type="ResourceLink"?>
  </xml>
}
for $pi in $xml//processing-instruction('link')
let $values := local:values($pi)
return $values?resource-uuid

旧版 XQuery 的另一种解决方案:

let $xml := document {
  <xml>
    <?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd35-f18014fdecf3"
      resource-id="570935" resource-type="fork" type="ResourceLink"?>
  </xml>
}
for $pi in $xml//processing-instruction('link')
for $pair in tokenize($pi, 's+')[substring-before(., '=') = 'resource-uuid']
return replace(substring-after($pair, '='), '^"|"$', '')

这两个代码片段都假设处理指令中的值都像示例中一样组成(键和值用等号分隔,值用双引号括起来(。

你提到的"注释"称为处理指令。

在处理指令中,使用类似于 XML 元素属性的keyword="value"语法是很常见的,但不幸的是,这只是一种约定,而不是 XML 固有的东西,因此您必须自己分析内容才能提取属性。(撒克逊有一个函数saxon:get-pseudo-attribute()(。

如果你使用的是Python,那么在Python代码而不是XPath代码中执行这个额外的解析阶段可能更简单 - 除非你实际上需要该值作为某个更大的XPath表达式的一部分,在这种情况下,细节取决于你使用的是XPath还是XQuery以及哪个版本。

相关内容

  • 没有找到相关文章

最新更新