2012-12-26 5 views
3

Я разбираю файл pptx и столкнулся с проблемой. Это пример исходного XML:Получить значение атрибута 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') 

возвращает ноль.

ответ

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

Вы можете ссылаться на пространство имен атрибутов в вашей 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") 
Смежные вопросы