3

我正在解析一个 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')

返回零。

4

2 回答 2

2

您可以像引用元素命名空间一样引用 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")
于 2012-12-26T14:01:10.527 回答
0

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
于 2012-12-26T13:10:38.777 回答