Nokogiri:控制新子元素的元素前缀

发布于 2025-01-05 20:44:13 字数 1844 浏览 1 评论 0原文

我有一个像这样的 xml 文档:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:foo="http://abc.com#" xmlns:bar="http://def.com" xmlns:ex="http://ex.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue"/>
  </foo:element>
</foo:root>

我需要向该元素添加子元素,使其看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:foo="http://abc.com#" xmlns:bar="http://def.com" xmlns:ex="http://ex.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue"/>
    <bar:otherElement foo:otherAttribute="newAttributeValue"/>
    <ex:yetAnotherElement foo:otherAttribute="yetANewAttributeValue"/>
  </foo:element>
</foo:root>

我可以使用以下命令在正确的位置添加元素:

require 'rubygems'
require 'nokogiri'
doc = Nokogiri::XML::Document.parse(File.open("myfile.xml"))
el = doc.at_xpath('//foo:element')

newEl = Nokogiri::XML::Node.new("otherElement", doc)            
newEl["foo:otherAttribute"] = "newAttributeValue"
el.add_child(newEl)

newEl = Nokogiri::XML::Node.new("yetAnotherElement", doc)           
newEl["foo:otherAttribute"] = "yetANewAttributeValue"
el.add_child(newEl)

但是新元素的前缀始终是“foo”:

<foo:root xmlns:foo="http://abc.com#" xmlns:bar="http://def.com" xmlns:ex="http://ex.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue" /> 
    <foo:otherElement foo:otherAttribute="newAttributeValue" /> 
    <foo:yetAnotherElement foo:otherAttribute="yetANewAttributeValue" /> 
  </foo:element>
</foo:root>

如何我可以为这些新的子元素设置元素名称的前缀吗?谢谢, 欧根

I have an xml document like this:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:foo="http://abc.com#" xmlns:bar="http://def.com" xmlns:ex="http://ex.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue"/>
  </foo:element>
</foo:root>

I need to add child elements to the element so that it looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:foo="http://abc.com#" xmlns:bar="http://def.com" xmlns:ex="http://ex.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue"/>
    <bar:otherElement foo:otherAttribute="newAttributeValue"/>
    <ex:yetAnotherElement foo:otherAttribute="yetANewAttributeValue"/>
  </foo:element>
</foo:root>

I can add elements in the correct location using the following:

require 'rubygems'
require 'nokogiri'
doc = Nokogiri::XML::Document.parse(File.open("myfile.xml"))
el = doc.at_xpath('//foo:element')

newEl = Nokogiri::XML::Node.new("otherElement", doc)            
newEl["foo:otherAttribute"] = "newAttributeValue"
el.add_child(newEl)

newEl = Nokogiri::XML::Node.new("yetAnotherElement", doc)           
newEl["foo:otherAttribute"] = "yetANewAttributeValue"
el.add_child(newEl)

However the prefix of the new elements is always "foo":

<foo:root xmlns:foo="http://abc.com#" xmlns:bar="http://def.com" xmlns:ex="http://ex.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue" /> 
    <foo:otherElement foo:otherAttribute="newAttributeValue" /> 
    <foo:yetAnotherElement foo:otherAttribute="yetANewAttributeValue" /> 
  </foo:element>
</foo:root>

How can I set the prefix on the element name for these new child elements? Thanks,
Eoghan

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

单身狗的梦 2025-01-12 20:44:13

(删除了有关定义名称空间的部分,与问题正交并在编辑中修复)

只需在代码中添加几行,您就会得到所需的结果:

require 'rubygems'
require 'nokogiri'
doc = Nokogiri::XML::Document.parse(File.open("myfile.xml"))
el = doc.at_xpath('//foo:element')

newEl = Nokogiri::XML::Node.new("otherElement", doc)            
newEl["foo:otherAttribute"] = "newAttributeValue"
# ADDITIONAL CODE
newEl.namespace = doc.root.namespace_definitions.find{|ns| ns.prefix=="bar"}
#
el.add_child(newEl)

newEl = Nokogiri::XML::Node.new("yetAnotherElement", doc)           
newEl["foo:otherAttribute"] = "yetANewAttributeValue"
# ADDITIONAL CODE
newEl.namespace = doc.root.namespace_definitions.find{|ns| ns.prefix == "ex"}
#
el.add_child(newEl)

结果:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:abc="http://abc.com#" xmlns:def="http://def.com" xmlns:ex="http://ex.com" xmlns:foo="http://foo.com" xmlns:bar="http://bar.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue"/>
    <bar:otherElement foo:otherAttribute="newAttributeValue"/>
    <ex:yetAnotherElement foo:otherAttribute="yetANewAttributeValue"/>
  </foo:element>
</foo:root>

(removed bit about defining namespace, orthogonal to question and fixed in edit)

just add a few lines to your code, and you get the result desired:

require 'rubygems'
require 'nokogiri'
doc = Nokogiri::XML::Document.parse(File.open("myfile.xml"))
el = doc.at_xpath('//foo:element')

newEl = Nokogiri::XML::Node.new("otherElement", doc)            
newEl["foo:otherAttribute"] = "newAttributeValue"
# ADDITIONAL CODE
newEl.namespace = doc.root.namespace_definitions.find{|ns| ns.prefix=="bar"}
#
el.add_child(newEl)

newEl = Nokogiri::XML::Node.new("yetAnotherElement", doc)           
newEl["foo:otherAttribute"] = "yetANewAttributeValue"
# ADDITIONAL CODE
newEl.namespace = doc.root.namespace_definitions.find{|ns| ns.prefix == "ex"}
#
el.add_child(newEl)

and the result:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:abc="http://abc.com#" xmlns:def="http://def.com" xmlns:ex="http://ex.com" xmlns:foo="http://foo.com" xmlns:bar="http://bar.com">
  <foo:element foo:attribute="attribute_value">
    <bar:otherElement foo:otherAttribute="otherAttributeValue"/>
    <bar:otherElement foo:otherAttribute="newAttributeValue"/>
    <ex:yetAnotherElement foo:otherAttribute="yetANewAttributeValue"/>
  </foo:element>
</foo:root>
儭儭莪哋寶赑 2025-01-12 20:44:13

命名空间“foo”未定义。

请参阅此了解更多详细信息:
Nokogiri/Xpath 命名空间查询

The namespace 'foo' is not defined.

See this for more details:
Nokogiri/Xpath namespace query

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文