У меня проблемы с редактированием файла XML. В настоящее время я пытаюсь использовать Nokogiri , но я открыт для любой другой библиотеки Ruby для решения этой проблемы.
Я пытаюсь добавить набор узлов в другой набор узлов. У обоих есть интересное пространство имен. Вот код Я пытаюсь добавить new_node к родителю сразу после первого <p:sp>
<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 после запуска приведенного выше кода:
<?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: Два узла должны быть <p:sp> и <a:off>, а не <p:p:sp> и <p:a:off>. Я мог бы просто удалить p: из new_node, но a: off все равно будет находиться в пространстве имен под p: что не может быть. Я знаю, что, должно быть, поступаю неправильно. Конечный результат, который я ищу:
<a:off>
<p:p:sp>
<p:a:off>
<?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>
Похоже, проблема была в Нокогири. 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>