2009-08-28 6 views
1

XMLファイルの編集に問題があります。私は現在、Nokogiriを使用しようとしていますが、私はこの問題を解決するために他のRubyライブラリに公開しています。Nokogiriを使用してXMLファイルに名前空間を持つノードを追加する

別のノードセット内にノードセットを追加しようとしています。どちらも興味深い名前空間を持っています。ここにコードがあります。私は上記のコードを実行した後、最初の<p:sp>

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は、以下のXMLのようになります右後の親にnew_nodeを追加しようとしています:

<?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> 

お知らせを、それがpの下にあるすべてのものを名前空間もう一度。 2つのノードは<p:sp>で、<a:off>ではなく、<p:p:sp><p:a:off>です.n:new_nodeからp:を削除することはできますが、a:offはp:の下の名前空間になります。私は何か間違っていなければならないことを知っている。私が探している最終結果は次のとおりです。

<?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

:「XMLは暴力のようなものです - それはあなたの問題を解決しない場合、あなたはそれを十分に使用していません。 " –

答えて

1

Nokogiriが問題だったようです。救助へのHpricot! (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) 

、出力は次のとおりです。鋸山のホームページから

<?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> 
関連する問題