有人知道如何用Python处理这种XML注解,这是我第一次看到这个。
<?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd35-f18014fdecf3" resource-id="570935" resource-type="fork" type="ResourceLink"?>
我需要查询这种"元素"来获取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以及哪个版本。