Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >如何使用Nokogiri Builder创建带有命名空间根元素的XML文档

如何使用Nokogiri Builder创建带有命名空间根元素的XML文档
EN

Stack Overflow用户
提问于 2009-12-01 22:35:26
回答 3查看 6.8K关注 0票数 13

我正在实现一个需要名称空间的XML数据导出器。我正在使用Nokogiri的XML Builder (版本1.4.0)来做这件事,但是,我不能让Nokogiri创建一个带有名称空间的根节点。

这是可行的:

代码语言:javascript
代码运行次数:0
复制
Nokogiri::XML::Builder.new { |xml| xml.root('xmlns:foobar' => 'my-ns-url') }.to_xml

<?xml version="1.0"?>
<root xmlns:foobar="my-ns-url"/>

如下所示:

代码语言:javascript
代码运行次数:0
复制
Nokogiri::XML::Builder.new do |xml| 
  xml.root('xmlns:foobar' => 'my-ns-url') { xml['foobar'].child }
end.to_xml

<?xml version="1.0"?>
<root xmlns:foobar="my-ns-url">
  <foobar:child/>
</root>

但是,我需要像<foo:root>这样的东西,但这不起作用:

代码语言:javascript
代码运行次数:0
复制
Nokogiri::XML::Builder.new { |xml| xml['foobar'].root('xmlns:foobar' => 'my-ns-url') }.to_xml

NoMethodError: undefined method `namespace_definitions' for #<Nokogiri::XML::Document:0x11bfef8 name="document">

显然,命名空间必须在使用前定义,因此无法将其添加到根节点。

我在Nokogiri的邮件列表中找到了"Define root node with a namespace?“,但没有回复。

有谁有解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-06 19:14:05

代码语言:javascript
代码运行次数:0
复制
require 'rubygems'
require 'nokogiri'

puts Nokogiri::XML::Builder.new do |xml| 
  xml.root("xmlns:foo"=>"url") do
    xml.parent.namespace = xml.parent.namespace_definitions.find{|ns|ns.prefix=="foo"}
    xml['foo'].child
  end
end.to_xml

您不能在定义名称空间之前使用xml['foo'],即在将其作为参数传递给根节点之前,因此,上面的代码将事后的名称空间添加到根节点。

票数 16
EN

Stack Overflow用户

发布于 2012-03-28 01:02:45

两年后,我找到了一种更简洁的方法,使用Nokogiri::XML::Builder的文档引用来检索根节点并将名称空间添加到根节点中,与前面的解决方案一样,它需要根节点存在,然后才能向其添加名称空间。

我将<root>元素改为<rootElement>,这样就更清楚了:

代码语言:javascript
代码运行次数:0
复制
builder = Nokogiri::XML::Builder.new do |xml| 
  xml.rootElement do
    # create a namespace and save it for later
    ns = xml.doc.root.add_namespace_definition('foo', 'my-ns-url')
    # you can also create multiple name spaces
    xml.doc.root.add_namespace_definition('bar', 'http://example.com/bar')

    # assign the saved namespace to rootElement
    xml.doc.root.namespace = ns

    xml['foo'].child
    xml['bar'].child
  end
end

现在,builder.to_xml将返回:

代码语言:javascript
代码运行次数:0
复制
<?xml version="1.0"?>
<foo:rootElement xmlns:foo="my-ns-url" xmlns:bar="http://example.com/bar">
  <foo:child/>
  <bar:child/>
</foo:rootElement>

我更喜欢这种方式,因为您不必搜索名称空间,而且添加多个名称空间也更容易。

票数 8
EN

Stack Overflow用户

发布于 2015-12-01 17:02:41

在Luke的回答三年后,它变得更加简单。您现在可以“在”定义名称空间之前使用它。这段代码:

代码语言:javascript
代码运行次数:0
复制
require 'nokogiri'

NAMESPACES = { 'xmlns:foo' => 'bar', 'xmlns:baz' => 'bat' }

builder = Nokogiri::XML::Builder.new { |xml|
  xml['foo'].RootElement(NAMESPACES) {
    xml['baz'].FirstChild
  }
}

puts builder.to_xml

输出此XML:

代码语言:javascript
代码运行次数:0
复制
<?xml version="1.0"?>
<foo:RootElement xmlns:foo="bar" xmlns:baz="bat">
  <baz:FirstChild/>
</foo:RootElement>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1829425

复制
相关文章
网页title图标_php 数据库显示在页面并能修改
重新定义TCPDF中的K_PATH_IMAGES常量(define(‘K_PATH_IMAGES’, xxxx) , 需要定义在加载tcpdf.php 之前)
全栈程序员站长
2022/10/03
4.2K0
网页实时显示时间_html页面布局代码
桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可
全栈程序员站长
2022/10/03
4K0
网页实时显示时间_html页面布局代码
在开启了CloudFlare的页面中显示当前节点信息
正如本站底部右下角所显示的那样当前CDN节点: San Jose, CA, United States - (SJC),是不是感觉有丶炫酷?请继续往下看
yumusb
2020/08/28
5.1K0
为什么html在浏览器中不能显示图片_做html网页图片显示不出来
我遇到的问题是写了一个HTML程序,结果在网页上面不能显示,原因是图片路径放置错了。
全栈程序员站长
2022/09/20
5.8K0
为什么html在浏览器中不能显示图片_做html网页图片显示不出来
weex eros APP 如何在vue页面显示图片,循环添加多张图片显示在vue页面上
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/acoolgiser/article/details/89016852
acoolgiser
2019/04/17
2K0
Python 实战(1):在网页上显示信息
上次简单介绍了 web.py。今天先来粗略解释下那个 hello world 页面的代码: import web 导入 web.py 模块。 urls = ( '/', 'index' ) 这是指定网站 url 的匹配规则,左边是正则表达式,右边是对应处理函数的名称。 class index: def GET(self): return "Hello, world!" 这便是处理请求的函数 index。GET 和 POST 是 HTTP 的两种请求方式,一般来说,GET 用于请求网
Crossin先生
2018/04/16
1.7K0
自定义wordpress每个分类显示多少页面数
一般的分页只需要在后台设置->阅读->博客中显示的页数,即可设置网站的分页,但是这么设置的分页是全站通用的,无论是首页、分类、搜索都显示一个分页数,但是若我们想单独控制某一个页面显示多少呢?下面我们就说说这种怎么实现。
PHP学习网
2022/08/03
7250
为抛弃刘海屏,苹果预备在显示屏上打孔,但这似乎已经落伍了
随着人脸识别解锁、支付等应用的兴起,相关技术及元器件也成为了移动智能手机的标配。从iPhone X发布至今,其后几乎每一款品牌都有支持人脸识别的新机发布,但也始终没能从根本上解决iPhone“刘海屏”的问题。当然,苹果也一直在尝试研究出更好的替代方案。
镁客网
2018/11/23
5630
在3D游戏中显示网页
在游戏中显示网页? 为什么要这么做呢? 其实可以做不少的应用: 嵌入帮助文档, 比如技能介绍, 可以做得很漂亮, 各种排版方式用传统UI做起来很费劲 活动公告页面直接在游戏中查看 游戏内的BBS/社区
逍遥剑客
2018/05/21
6440
直接iframe方式在网页上显示天气插件
天气预报调用网址(可定制):http://www.tianqi.com/plugin/
科控物联
2023/09/22
1.4K0
直接iframe方式在网页上显示天气插件
将jpeg图片显示在framebuffer上
点击(此处)折叠或打开 /************************************************** * example5.c * Author: T-bagwell * * Compile:gcc -Wall example5.c -o example5 *************************************************/ #include <stdio.h> #inclu
用户3765803
2019/03/05
1.2K0
浏览器中输入 URL 到网页显示的过程
图片来源:《图解HTTP》 总体来说分为以下几个过程: DNS 解析 TCP 连接 发送 HTTP 请求 服务器处理请求并返回 HTTP 报文 浏览器解析渲染页面 连接结束 具体可以参考下面这篇文章: 从输入 URL 到页面加载发生了什么? 常见 HTTP 状态码 状态码 各协议与 HTTP 协议之间的关系 图片来源:《图解HTTP》
happyJared
2019/06/24
1.4K0
在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
上次的nodejs操作arduino入门篇中实现了如何连接arduino。这次我们来实现通过arduino测量室内温度并在浏览器上显示出来。 【所需材料】 硬件:LM35温度传感器,arduino u
用户1749219
2018/05/16
2.2K0
浏览器将URL变成一个屏幕上显示的网页的过程?
前言   一个浏览器是怎么工作的? 正文 URL变网页过程:   1.浏览器通过http或https协议,向服务端请求页面   2.将请求过来的HEML代码通过解析,构建DOM树   3.计算DOM
Dawnzhang
2019/03/08
7910
浏览器将URL变成一个屏幕上显示的网页的过程?
PC页面全屏显示以及退出全屏显示
//点击,进入全屏 $('#btn4').click(()=>{ let el = document.documentElement; let rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullScreen; if(typeof rfs != 'undefined' && rfs){ rfs.call
用户1174387
2021/10/26
5.3K0
如何下载网页上的视频?
You-get是GitHub上的一个项目,也可以说是一个命令行程序,帮助大家下载大多主流网站上的视频、图片及音频。支持的网站非常多,我们可以先来看一部分。
狼啸风云
2020/07/27
4.1K0
如何下载网页上的视频?
javascript 获取多种主流浏览器显示页面高度(转)
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.documentElement.clientWidth ==> 可见区域宽度 document.documentElement.clientHeight ==> 可见区域高度 FireFox中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.documentElement.clientWidth ==> 可见区域宽度 document.documentElement.clientHeight ==> 可见区域高度 Opera中:  document.body.clientWidth ==> 可见区域宽度 document.body.clientHeight ==> 可见区域高度 document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽) document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高) 没有定义W3C的标准,则 IE为: document.documentElement.clientWidth ==> 0 document.documentElement.clientHeight ==> 0 FireFox为: document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高) Opera为: document.documentElement.clientWidth ==> 页面对象宽度(即BODY对象宽度加上Margin宽)document.documentElement.clientHeight ==> 页面对象高度(即BODY对象高度加上Margin高)
lin_zone
2018/08/15
9830
Confluence 如何在页面中显示目录
在默认情况下,Confluence 是不能在页面中显示目录和当前页面中的内容导航的。
HoneyMoose
2021/12/14
1.9K0
【JavaScript小项目】在网页上显示选择的图片
思路分析 选用<input type="file">原生组件,实现该组件美化。 选用<img src="file">实现图片预览。 代码实现 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图片预览</title> <script src="js/test.js"> function upload(file) { cons
efonfighting
2020/02/13
1.2K0
如何在html页面显示html标签源码
这是一篇不正经实现方案报道。 1 引言 先来看个问答: stackoverflow: Why was the xmp HTML tag deprecated? [duplicate] 这个问题感觉
celineWong7
2020/11/05
11.5K0

相似问题

无法访问Azure容器服务

11

WebDriver容器无法访问DockerComposeContainer服务

15

服务结构容器-无法访问群集内的服务

13

使用Kubernetes的Azure容器服务-无法访问Internet的容器

216

Azure容器服务容器无法访问除80以外的其他端口

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档