【问题标题】:Add an attribute to a xml tag in an already existing XML file将属性添加到现有 XML 文件中的 xml 标记
【发布时间】:2013-10-02 16:06:00
【问题描述】:

我正在解析一个 docx 文件并得到一个错误:“未定义的命名空间前缀”。为了解决这个问题,我决定定义名称空间,它在根标记中不存在。

为此,我需要在根标记中插入一个带有“(url)”值的“xmlns:wp”属性。

如何使用 Nokogiri gem 做到这一点?

或者,如果使用其他 gem 更容易,请告诉我如何操作。我正在使用以下代码将属性添加到 XML 元素:

doc = Nokogiri::XML(File.open(path_to_file)
doc.xpath('w:document').each do |document|
  document.set_attribute('xmlns:wp', 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing')
end

并获取具有添加属性的新元素。然后我可以重写整个文件,但也许还有另一种方法可以解决我的问题?

【问题讨论】:

  • 请提供一个小的示例 XML 文件和产生此错误的代码。

标签: ruby xml nokogiri xml-namespaces


【解决方案1】:

您需要提供有关导致该错误的原因的更多详细信息。仅解析 XML 文档不会让 Nokogiri 抛出该错误;相反,它将忽略并丢弃未声明的命名空间:

require 'nokogiri'

# Here's a valid namespace used on an element:
doc = Nokogiri.XML("<root xmlns:a='hi'><a:foo/></root>")
puts doc.root
#=> <root xmlns:a="hi">
#=>   <a:foo/>
#=> </root>

# Here's a namespace that gets ignored
doc = Nokogiri.XML("<root xmlns:a='hi'><zzz:foo/></root>")
puts doc
#=> <root xmlns:a="hi">
#=>   <foo/>
#=> </root>

p doc.at('foo').namespace
#=> nil

# It's OK to declare namespaces later on
doc = Nokogiri.XML("<root><kid xmlns:zzz='yo'><zzz:foo/></kid></root>")
puts doc.root
#=> <root>
#=>   <kid xmlns:zzz="yo">
#=>     <zzz:foo/>
#=>   </kid>
#=> </root>

解析使用从未声明不可撤销的名称空间的 XML 文档会丢失它们。因此,即使您可以像这样在任何节点上设置属性......

mynode["xmlns:yay"]="someurl"

...它对您已经解析的引用该命名空间名称的节点没有帮​​助。

现在,也许您的问题是您正在按稍后声明的命名空间搜索节点?

p doc.at_xpath('//zzz:foo')
#=> in `evaluate': Undefined namespace prefix: //zzz:foo (Nokogiri::XML::XPath::SyntaxError)

如果是这样,你必须告诉 Nokogiri 命名空间:

p doc.at_xpath('//zzz:foo','zzz'=>'yo') 
#=> #<Nokogiri::XML::Element:0x80691894 name="foo" namespace=#<Nokogiri::XML::Namespace:0x806917cc prefix="zzz" href="yo">>

或者,如果您只是解析文档(以后不将其作为 XML 发出)并且您没有任何名称冲突,您可以作弊并丢弃所有命名空间以进行更简单的查询:

p doc.at_xpath('//foo')
#=> nil

doc.remove_namespaces!
p doc.at_xpath('//foo')
#=> #<Nokogiri::XML::Element:0x805fa2dc name="foo">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2022-09-24
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多