我正在解析pptx文件并遇到了问题。这是源XML的示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<p:sldMasterIdLst>
<p:sldMasterId id="2147483648" r:id="rId2"/>
</p:sldMasterIdLst>
<p:sldIdLst>
<p:sldId id="256" r:id="rId3"/>
</p:sldIdLst>
<p:sldSz cx="10080625" cy="7559675"/>
<p:notesSz cx="7772400" cy="10058400"/>
</p:presentation>
我需要在r:id
代码中获取sldMasterId
属性值。
doc = Nokogiri::XML(path_to_pptx)
doc.xpath('p:presentation/p:sldMasterIdLst/p:sldMasterId').attr('id').value
返回2147483648
,但我需要rId2
,这是r:id
属性值。
我找到了attribute_with_ns(name, namespace)
方法,但是
doc.xpath('p:presentation/p:sldMasterIdLst/p:sldMasterId').attribute_with_ns('id', 'r')
返回nil。
答案 0 :(得分:1)
http://nokogiri.org/Nokogiri/XML/Node.html#method-i-attributes
如果需要区分具有相同名称的属性,则使用不同的名称空间使用attribute_nodes。
doc.xpath('p:presentation/p:sldMasterIdLst/p:sldMasterId').each do |element|
element.attribute_nodes().select do |node|
puts node if node.namespace && node.namespace.prefix == "r"
end
end
答案 1 :(得分:1)
您可以像引用元素名称空间一样引用xpath中的属性名称空间:
doc.xpath('p:presentation/p:sldMasterIdLst/p:sldMasterId/@r:id')
如果您想使用attribute_with_ns
,则需要使用实际命名空间,而不仅仅是前缀:
doc.at_xpath('p:presentation/p:sldMasterIdLst/p:sldMasterId')
.attribute_with_ns('id', "http://schemas.openxmlformats.org/officeDocument/2006/relationships")