ruby – 使用Nokogiri xpath(使用xml namesapce)在xml中搜索节点
发布时间:2020-12-17 02:34:59 所属栏目:百科 来源:网络整理
导读:我发现Nokogiri在处理xml方面非常强大,但我遇到了一个特例 我试图像这样搜索xml文件中的节点 ?xml version="1.0" encoding="utf-8" ? ConfigurationSection Configuration xmlns="clr-namespace:Newproject.Framework.Server.Store.Configuration;assembly=N
|
我发现Nokogiri在处理xml方面非常强大,但我遇到了一个特例
我试图像这样搜索xml文件中的节点 <?xml version="1.0" encoding="utf-8" ?>
<ConfigurationSection>
<Configuration xmlns="clr-namespace:Newproject.Framework.Server.Store.Configuration;assembly=Newproject.Framework.Server" >
<Configuration.Store>SqlServer</Configuration.Store>
<Configuration.Engine>Staging</Configuration.Engine>
</Configuration>
</ConfigurationSection>
当我做的时候 xml = File.new(webconfig,"r")
doc = Nokogiri::XML(xml.read)
nodes = doc.search("//Configuration.Store")
xml.close
我得到了空节点.我错过了什么?我试过了 nodes = doc.search("//Configuration.Store")
仍然没有运气. 更新:我已附加整个xml文件 再次更新了xml:我的错误,它确实有一个namaspace 解决方法
编辑#2:解决方案现在包括#parse_with_namespace
您可以在Nokogiri::XML::Node documentation中找到许多与命名空间相关的Nokogiri方法. # encoding: UTF-8
require 'rspec'
require 'nokogiri'
XML = <<XML
<?xml version="1.0" encoding="utf-8" ?>
<ConfigurationSection>
<Configuration xmlns="clr-namespace:Newproject.Framework.Server.Store.Configuration;assembly=Newproject.Framework.Server" >
<Configuration.Store>SqlServer</Configuration.Store>
<Configuration.Engine>Staging</Configuration.Engine>
</Configuration>
</ConfigurationSection>
XML
class ConfigParser
def parse(xml)
doc = Nokogiri::XML(xml).remove_namespaces!
configuration = doc.at('/ConfigurationSection/Configuration')
store = configuration.at("./Configuration.Store").text
engine = configuration.at("./Configuration.Engine").text
{store: store,engine: engine}
end
def parse_with_namespace(xml)
doc = Nokogiri::XML(xml)
configuration = doc.at('/ConfigurationSection/xmlns:Configuration','xmlns' => 'clr-namespace:Newproject.Framework.Server.Store.Configuration;assembly=Newproject.Framework.Server')
store = configuration.at("./xmlns:Configuration.Store",'xmlns' => 'clr-namespace:Newproject.Framework.Server.Store.Configuration;assembly=Newproject.Framework.Server').text
engine = configuration.at("./xmlns:Configuration.Engine",'xmlns' => 'clr-namespace:Newproject.Framework.Server.Store.Configuration;assembly=Newproject.Framework.Server').text
{store: store,engine: engine}
end
end
describe ConfigParser do
before(:each) do
@parsed = subject.parse XML
@parsed_with_ns = subject.parse_with_namespace XML
end
it "should be able to parse the Configuration Store" do
@parsed[:store].should eq "SqlServer"
end
it "should be able to parse the Configuration Engine" do
@parsed[:engine].should eq "Staging"
end
it "should be able to parse the Configuration Store with namespace" do
@parsed_with_ns[:store].should eq "SqlServer"
end
it "should be able to parse the Configuration Engine with namespace" do
@parsed_with_ns[:engine].should eq "Staging"
end
end
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
