2009-08-28 10 views
1

Je n'arrive pas à modifier un fichier XML. J'essaie actuellement d'utiliser Nokogiri, mais je suis ouvert à toute autre bibliothèque Ruby pour résoudre ce problème. J'essaie d'ajouter un ensemble de nœuds à l'intérieur d'un autre ensemble de nœuds. Les deux ont des espaces de noms intéressants. Voici le code. Je suis en train d'ajouter le new_node au parent juste après la première <p:sp>Ajout de noeuds avec des espaces de noms dans un fichier XML avec Nokogiri

require 'rubygems' 
require 'nokogiri' 

parent = <<EOF 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"> 
    <p:spTree> 
    <p:sp> 
     <p:nvSpPr> 
     <p:cNvPr id="1" name="Title 1"/> 
     </p:nvSpPr> 
    </p:sp> 
    </p:spTree> 
</p:sld> 
EOF 

new_node = <<EOF 
<p:sp> 
    <p:cNvPr id="2" name="Title 2"/> 
    <a:off x="1524000" y="4572000"/> 
</p:sp> 
EOF 

@doc = Nokogiri::XML(parent) 
@doc.xpath('.//p:sp').after(new_node) 

@DOC ressemble à quelque chose comme le XML ci-dessous après le code ci-dessus fonctionne:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"> 
    <p:spTree> 
    <p:sp> 
     <p:nvSpPr> 
     <p:cNvPr id="1" name="Title 1"/> 
     </p:nvSpPr> 
    </p:sp> 

    <p:p:sp> 
    <p:p:cNvPr name="Title 2" id="2"/> 
    <p:a:off x="1524000" y="4572000"/> 
    </p:p:sp> 

    </p:spTree> 
</p:sld> 

avis il tout sous p un espace de noms : encore. Les deux noeuds devraient être <p:sp> et <a:off> pas <p:p:sp> et <p:a:off> Je pourrais juste enlever le p: du nouveau_node mais le a: off serait toujours namespaced sous p: ce qu'il ne peut pas être. Je sais que je dois me tromper. Le résultat final que je cherche est:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"> 
    <p:spTree> 
    <p:sp> 
     <p:nvSpPr> 
     <p:cNvPr id="1" name="Title 1"/> 
     </p:nvSpPr> 
    </p:sp> 
    <p:sp> 
     <p:cNvPr name="Title 2" id="2"/> 
     <a:off x="1524000" y="4572000"/> 
    </p:sp> 
    </p:spTree> 
</p:sld> 
+0

la page d'accueil Nokogiri: « XML est comme la violence - si elle ne résout pas vos problèmes, vous n'utilisez pas assez. " –

Répondre

1

On dirait que Nokogiri était le problème. Hpricot à la rescousse! (RIP _why)

#!/usr/bin/ruby  
require 'rubygems' 
require 'hpricot' 

parent = <<EOF 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"> 
    <p:spTree> 
    <p:sp> 
     <p:nvSpPr> 
     <p:cNvPr id="1" name="Title 1"/> 
     </p:nvSpPr> 
    </p:sp> 
    </p:spTree> 
</p:sld> 
EOF 

new_node = <<EOF 
    <p:sp> 
    <p:cNvPr id="2" name="Title 2"/> 
    <a:off x="1524000" y="4572000"/> 
    </p:sp> 
EOF 


doc = Hpricot(parent) 

doc.search('//p:sp').after(new_node) 

Et la sortie est:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<p:sld mc:PreserveAttributes="mv:*" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" mc:Ignorable="mv" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> 
    <p:sptree> 
    <p:sp> 
     <p:nvsppr> 
     <p:cnvpr name="Title 1" id="1" /> 
     </p:nvsppr> 
    </p:sp> 

    <p:sp> 
    <p:cnvpr name="Title 2" id="2" /> 
    <a:off x="1524000" y="4572000" /> 
    </p:sp> 

    </p:sptree> 
</p:sld>