如何处理“<?”用Python实现xml文件的注释

2024-07-08 11:04:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

<?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd35-f18014fdecf3" resource-id="570935" resource-type="fork" type="ResourceLink"?>

我需要查询这种'element'来获得resource-uuid值。在

感谢您的帮助。在


Tags: iduuidtypelinkxmlelementforkresource
3条回答

如果您的处理器支持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,还有一个解决方案:

^{pr2}$

这两个代码片段都是在这样一个假设下工作的:处理指令中的值都是按照您的示例(键和值用等号分隔,值用双引号括起来)。在

多亏了大家,我了解了加工指令,通过这个,我研究了如何处理它,如果有人需要的话,我让我的划痕:

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 ?>。在

找到details in section 2.6!在

虽然xml声明必须首先以<?xml开头,但其他处理指令可能(几乎)出现在xml中的任何位置。在

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

所以这就是格式良好的XML:

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

我不使用python,但这将在SQL Server中返回PI:

^{pr2}$

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

This answer可能对你有帮助。在

相关问题 更多 >

    热门问题