加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读