- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试在根节点下添加子节点。我尝试使用以下 XML,但它不起作用。
builder = Nokogiri::XML::Builder.with(@doc) do |xml|
nodes = Nokogiri::XML::NodeSet.new(@doc, [])
[].each {|nodes_one_by_one|
<< nodes_one_by_one.Book
<< nodes_one_by_one.Pen
}
end
我需要像这样在根节点下添加节点:
<Catalog>
<Book>abc</Book>
<Book_Author>Benjamin</Book_author>
</Catalog>
这对我有用,但我要在文档中的特定位置之后添加这些节点:
<Catalog>
<!--
<Book>abc</Book>
<Book_Author>Benjamin</Book_author>
-->
<Interface></Interface>
<Dialog></Dialog>
<Manifest></Manifest>
</Catalog>
我用 at_xpath('//Catlog')
试过了,但它在元素的末尾添加了它:
<Catalog>
<Interface></Interface>
<Dialog></Dialog>
<Manifest></Manifest>
<!--
<Book>abc</Book>
<Book_Author>Benjamin</Book_author>
-->
</Catalog>
和
book = Nokogiri::XML::Node.new('book', doc)
pen = Nokogiri::XML::Node.new('pen', doc)
.
.
有没有办法循环使用each
而不是一个一个地添加它们。我试过这种方式,但那行不通:
builder = Nokogiri::XML::Builder.with(doc) do |xml|
nodes = Nokogiri::XML::Node.new(doc, [])
[].each {|child_list_element|
child_list_element.Book "value"
child_list_element.Pen "value"
child_list_element.Diary "value"
child_list_element.Pen_stand "value"
child_list_element.Pencil "value"
.
.
.
}
end
doc << nodes
代码可能有误,但我想这样做。
此外,我可以将所有元素添加为 NodeSet 而不是 Node 吗?
嵌套的 OpenStruct 似乎不起作用。我试过:
商店的目录集合:
require 'ostruct'
require 'nokogiri'
collection = [
OpenStruct.new(:catalogStoreNumber => '657758',
:catalogStoreId => 'CTH6536',
:catalogStoreLocation => 'UnitedStates',
:catalogOwnerId => 'TYCT11190',
:catalogOwner => 'McGrawHill Pub.',
:catalogList => OpenStruct.new(
:catalogProductInfo => OpenStruct.new(
:productType => 'Book',
:productName => 'The Client',
:productId => 'CRSUS113246A',
:productCategory => 'Crime And Suspense',
:productSubcategory => 'Vintage Books',
:productPrice => '45.50 USD',
:productAuthor => OpenStruct.new(
:authorFirstName =>'John Grisham',
:authorMiddleName=> 'Willburt',
:authorContact => '19876648981')),
:catalogProductInfo => OpenStruct.new(
:productType => 'Pen',
:productName => 'Reynolds',
:productId => 'PRREY546647',
:productCategory => 'Misc. Stationary',
:productSubcategory => 'Stationery Items',
:productPrice => '3.00 USD',
:productManufacturer => 'Reynolds Inc.',
:productAuthor => OpenStruct.new(
:authorFirstName => 'Ryan Reynolds',
:authorMiddleName => 'William',
:authorContact => '16577589898')),
:catalogListType => 'ProductCollection',
:catalogListSource => 'Web'
),
:catalogVerificaitionLog => OpenStruct.new(
:catalogVerificationStatus => 'Verified',
:catalogVerificationDateTime => '2012-03-12T13:00:15+5:30',
:catalogVerificationId => '64774A',
:catalogVerificationRequestedBy => 'user_121')
)]
我想访问第一个 catalogProductInfo
的 productType
并且我使用了
collection.catalogList.catalogProductInfo.productType.content
我得到了这个错误:
undefined method `productType' for #<Array:0x3057438> (NoMethodError)
OpenStruct 是否支持嵌套的 OpenStruct 我想使用 OpenStruct 和 Nokogiri 构造以下格式的 XML?
<CatalogOrder>
<CatalogStoreNumber>657758</CatalogStoreNumber>
<CatalogStoreId>CTH6536</CatalogStoreId>
<CatalogStoreLocation>UnitedStates</CatalogStoreLocation>
<CatalogOwnerId>TYCT11190</CatalogOwnerId>
<CatalogOwner>McGrawHill Pub.</CatalogOwner>
<CatalogList>
<CatalogProductInfo>
<ProductType>Book</ProductType>
<ProductName>The Client</ProductName>
<ProductId>CRSUS113246A</ProductId>
<ProductCategory>Crime And Suspense</ProductCategory>
<ProductSubCategory>Vintage Books</ProductSubCategory>
<ProductPrice>45.50 USD</ProductPrice>
<ProductAuthor>
<AuthorFirstName>John Grisham</AuthorFirstName>
<AuthorMiddleName>Willbur</AuthorMiddleName>
<AuthorContact>19876648981</AuthorContact>
</ProductAuthor>
</CatalogProductInfo>
<CatalogProductInfo>
<ProductType>Pen</ProductType>
<ProductName>Reynolds</ProductName>
<ProductId>PRREY546647</ProductId>
<ProductCategory>Misc. Stationary</ProductCategory>
<ProductSubCategory>Stationary Items</ProductSubCategory>
<ProductPrice>3.00 USD</ProductPrice>
<ProductAuthor>
<AuthorFirstName>Ryan Reynolds</AuthorFirstName>
<AuthorMiddleName>William</AuthorMiddleName>
<AuthorContact>16577589898</AuthorContact>
</ProductAuthor>
</CatalogProductInfo>
<CatalogListType>ProductCollection</CatalogListType>
<CatalogListSource>Web</CatalogListSource>
</CatalogList>
<CatalogVerificationLog>
<CatalogVerificationStatus>Verified</CatalogVerificationStatus>
<CatalogVerificationDateTime>2012-03-12T13:00:15+5:30</CatalogVerificationDateTime>
<CatalogVerificationId>64774A</CatalogVerificationId>
<CatalogVerificationRequestedBy>User_121</CatalogVerificationRequestedBy>
</CatalogVerificationLog>
</CatalogOrder>
我想使用 Nokogiri 和 OpenStruct 来做到这一点,但我不确定使用 OpenStruct 是否可行,因为它缺乏嵌套功能。是否有任何其他方法可以不受任何限制地使用 JSON 来完成此操作?
最佳答案
如果我对您的理解正确,以下内容应该大致是您要查找的内容:
doc = Nokogiri::XML(original_xml_string)
catalog = doc.at_css('Catalog') # #at_css will just grab the first node.
# use #css if you want to loop through several.
# alternatively just use doc.root
book = Nokogiri::XML::Node.new('Book', doc)
book_author = Nokogiri::XML::Node.new('Book_Author', doc)
book.content = 'abc'
book_author.content = 'benjamin'
catalog << book
catalog << book_author
<<
应该在元素末尾之前附加节点。
更新问题并根据@Phrogz 的建议进行简化后,这应该可以满足您的要求:
require 'nokogiri'
xml = <<'XML'
<Catalog>
<Interface></Interface>
<Dialog></Dialog>
<Manifest></Manifest>
</Catalog>
XML
doc = Nokogiri::XML(xml)
catalog = doc.root
catalog.first_element_child.before("<Book_Author>abc</Book_Author>")
catalog.first_element_child.before("<Book>benjamin</Book>")
puts doc.to_xml
要遍历集合,动态添加节点,并使用 NodeSet,请尝试以下操作:
require 'nokogiri'
require 'ostruct'
xml = <<-'XML'
<Catalog>
<Interface></Interface>
<Dialog></Dialog>
<Manifest></Manifest>
</Catalog>
XML
collection = [
OpenStruct.new(book: '1984', pen: 'George Orwell'),
OpenStruct.new(book: 'Thinking, Fash and Slow', pen: 'Daniel Kahneman')
]
doc = Nokogiri::XML(xml)
catalog = doc.root
node_set = Nokogiri::XML::NodeSet.new(doc)
collection.each do |object|
book = Nokogiri::XML::Node.new('Book', doc)
book_author = Nokogiri::XML::Node.new('Book_Author', doc)
book.content = object.book
book_author.content = object.pen
node_set << book
node_set << book_author
end
catalog.first_element_child.before(node_set)
puts doc.to_xml
关于ruby - 如何使用Nokogiri在NodeSet中添加子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10300095/
我发现了一个 xsl:key 似乎不起作用的情况。 我正在将 XSLT 1 与 Xalan(已编译)一起使用,这就是正在发生的事情: 1.- 这有效:名为 的 key 测试 1 工作正常:
我正在尝试在 Java 中创建 XPath 表达式(8,默认 XPath 实现)。我正在执行以下操作: Object res = xpath.evaluate("(//*[local-name()='
我正在转换一个 XML 文档。有一个属性@prettydate这是一个类似于“Friday, May 7, 2010”的字符串。我想拆分该字符串并添加指向月份和年份的链接。我正在使用 exslt:st
我一直在阅读关于在文档中选择唯一节点(使用 Muenchian 方法)的不同问题,但在我的情况下我不能使用键(或者我不知道如何使用键),因为我正在处理节点集并且不在文件上。 并且不能在节点集上设置键。
我解析一个非常大的 xml 文件(来自 jpylyzer,一个 jp2 属性提取器)。此 xml 包含许多 JP2 图像的属性,每个图像都具有相同的元素,例如: //results/jpylyzer/
我在 Nokogiri 中使用 XPath 解析从 Google 联系人 API 返回的 XML。 def getcontact doc = Nokogiri::XML.parse(open(ur
我正在使用 Nokogiri 的 xpath 方法寻找我的 input 元素。它返回类 Nokogiri::XML::NodeSet 的对象: [#, #, #, #, #]> 有没有比使用 to_s
我正在尝试在 Memcache 中缓存 Weatherman 的响应 ( https://github.com/dlt/yahoo_weatherman ) 以避免多次获取天气,我正在这样做: w
我拉了一个Nokogiri::XML::NodeSet来自页面,结果如下: 我无法弄清楚如何转换它(对人类来说很明显)标记到 Mechanize/Nokogiri 解析的对象中,这样我就
我正在使用 Crystal,并试图检索 XML 文档中节点的 ID: 我正在使用以下代码获取 ID require "xml" file = File.read("path/to/doc.xml")
我正在使用 R 中的 xml2 包解析一些非常大的 xml 文件。read_xml() 成功加载了大文件,但是当我尝试使用 xml_find_all() 时,我收到“错误:内存分配失败:增长的节点集命
我正在使用 R 中的 xml2 包解析一些非常大的 xml 文件。read_xml() 成功加载了大文件,但是当我尝试使用 xml_find_all() 时,我收到“错误:内存分配失败:增长的节点集命
我试图为 xml 文件中的特定元素设置一个属性,并且我成功地使用了 doc.css('Object').attr("Id").value = timestamp 这很好,直到“对象”不存在导致程序异常
我想按标题值对 Nokigiri 节点集进行排序。尝试了以下代码,但排序不起作用:/有什么建议吗? doc.xpath("//item").sort{|x,y| x.xpath('foo:attr[@
我想从 Nokogiri NodeSet 中获取未转义的内部 html。有谁知道如何做到这一点? 最佳答案 有什么不妥吗? nodeset.inner_html 关于ruby - 如何获取 ruby
我有一个 XmlNodeList,我需要将其设置为一种格式,然后我可以通过从 C# 扩展方法调用它来在 XSLT 样式表中重复使用它。 有人可以帮忙吗?我读到它可能与使用 XPathNavigator
我开始在 w3cschool 学习 xpath。我正在尝试评估游戏中的玩家数量。 (因此计算屏幕名称和 text() 元素/属性) 这是我的示例 xml: My Game
我有一个像这样的颜色元素序列: 还有一个单词序列: 1px Blue Solid 找到 Colors/Color/@name 属性与 Wo
当试图模拟 Faraday::Response对象,我试过: mock(Faraday::Response, :env => {:body => "...some xml..."}) ...但是当我调
我的代码在 Jetty 中工作正常,但一旦在 WebSphere 中部署,我就会收到 java.lang.VerifyError 异常,根本没有任何额外信息(甚至没有消息)。 代码: Class c
我是一名优秀的程序员,十分优秀!