gpt4 book ai didi

ruby - 使用 Nokogiri xpath(带有 xml 命名空间)在 xml 中搜索节点

转载 作者:数据小太阳 更新时间:2023-10-29 07:30:52 26 4
gpt4 key购买 nike

我发现 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

关于ruby - 使用 Nokogiri xpath(带有 xml 命名空间)在 xml 中搜索节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com