如何查询包含属性名称 A 的元素,以及带有 "css" 的命名空间 B?



我的问题不同于"如何使用Nokogiri获取带有命名空间的属性的值?"。

我的XML包含带有名称空间的属性。如何使用Nokogiri的css方法查询包含attributeNameA和namespaceB(namespaceB:attributeNameA="attributeAValue")的元素?

这是我的代码:

xmlContent = %Q|
<?xml version="1.0"?>
<ns1:el1 xmlns:ns1="blabla" >
    <ns1:el2 ns1:att="123">with namespace</ns1:el2 >
    <ns1:el2 att="noNameSpace">no namespace</ns1:el2 >
</ns1:el1>|
xml_doc  = Nokogiri::XML(xmlContent)
#no namespace
result = xml_doc.css('ns1|el2[att]')
result.each {|i| puts i}
#with namespace
result = xml_doc.css('ns1|el2[ns1|att]') #error unexpexted '|'
result.each {|i| puts i}

2011年1月6日编辑:通过此链接:https://github.com/tenderlove/nokogiri/issues/257#issuecomment-3365636 Nokogiri不支持直接查询具有namespaced属性的xml元素。

真正的用例是修改SSIS包(*.dtsx);我无法查询属性DTS:Name包含"projectVar_"的所有元素。

对于这个用例,我必须通知nokogiri团队。

当您解析文档时,Nokogiri试图理解它,但未能理解命名空间声明:

puts xml_doc.errors

退货:

[#<Nokogiri::XML::SyntaxError: XML declaration allowed only at the start of the document>]

这是因为XML DECL:

<?xml version="1.0"?>

删除它可以解决这个问题。

访问节点属性的方式也不正确:

result = xml_doc.css('ns1|el2[att]')
result.each {|i| puts i}

应该是:

result = xml_doc.css('ns1|el2')
result.each { |i| puts i['att'] }

尝试访问带有名称空间的节点的属性是很奇怪的。我不记得曾经见过以名称命名的属性。野村似乎也不喜欢它:

如果我运行这个:

require 'nokogiri'
xmlContent = %Q|
<ns1:el1 xmlns:ns1="blabla">
  <ns1:el2 ns1:att="123">with namespace</ns1:el2 >
  <ns1:el2 att="noNameSpace">no namespace</ns1:el2 >
</ns1:el1>|
xml_doc = Nokogiri::XML(xmlContent)
puts xml_doc.errors 
puts "Searching for: 'att' attribute"
result = xml_doc.css('ns1|el2')
result.each { |i| puts i['att'] }
puts "Searching for: 'ns1|att' attribute"
result = xml_doc.css('ns1|el2')
result.each { |i| puts i['ns1|att'] }

我得到这个:

Searching for: 'att' attribute
123
noNameSpace
Searching for: 'ns1|att' attribute

result.first # => #<Nokogiri::XML::Element:0x8051e19c name="el2" namespace=#<Nokogiri::XML::Namespace:0x8051f344 prefix="ns1" href="blabla"> attributes=[#<Nokogiri::XML::Attr:0x8051e084 name="att" namespace=#<Nokogiri::XML::Namespace:0x8051f344 prefix="ns1" href="blabla"> value="123">] children=[#<Nokogiri::XML::Text:0x80519e30 "with namespace">]>
result.first.keys # => ["att"]
result.first.values # => ["123"]
result.first['att'] # => "123"
result.first['ns1|att'] # => nil
result.first['ns1:att'] # => nil
result.last # => #<Nokogiri::XML::Element:0x8051356c name="el2" namespace=#<Nokogiri::XML::Namespace:0x8051f344 prefix="ns1" href="blabla"> attributes=[#<Nokogiri::XML::Attr:0x805133a0 name="att" value="noNameSpace">] children=[#<Nokogiri::XML::Text:0x805122d4 "no namespace">]>
result.last.keys # => ["att"]
result.last.values # => ["noNameSpace"]
result.last['att'] # => "noNameSpace"
result.last['ns1|att'] # => nil
result.last['ns1:att'] # => nil

相关内容

  • 没有找到相关文章

最新更新