我有一个如下所示的 xml 文件。
<root>
<children>
<foo1 val="23"/>
<foo2 val="14"/>
</children>
</root>
我希望使用 xmlNewChild() 函数和 xmlNewProp() 函数向节点添加一个名为 foo 的新子节点。我想生成如下内容。
<root>
<children>
<foo1 val="23"/>
<foo2 val="14"/>
<foo3 val="5"/>
</children>
</root>
但是,我总是以以下结尾。
<root>
<children>
<foo1 val="23"/>
<foo2 val="14"/>
<foo3 val="5"/></children>
</root>
我知道 libxml2 默认不支持空格。但是,有没有办法达到我想要的结果?对于新添加的 child ,我需要在前面获取这些选项卡,在最后获取换行符。
如有任何帮助,我们将不胜感激。谢谢!
最佳答案
问题是 XML 结构实际上是这样的:
<root>
[TEXT:"\n "]
<children>
[TEXT:"\n "]
<foo1 val="23"/>
[TEXT:"\n "]
<foo2 val="14"/>
[TEXT:"\n "]
</children>
[TEXT:"\n"]
</root>
如果你只是在children的末尾添加一个额外的元素节点, 你可以看到你得到的是不可避免的(因为没有文本节点来携带换行符和 foo3 和 children 之间所需的缩进)。
您需要编辑 children 中的最终文本节点(紧接在 foo2 之后的那个)给它一个额外的缩进,然后追加你的新节点,然后追加一个新的文本节点来缩进 </children> .或者,您可以在 children 中插入与先前文本节点相同的文本节点。然后是 children 中最后一个文本节点之前的新元素节点.两者都应该给你相同的结果,你需要的那个:
<root>
[TEXT:"\n "]
<children>
[TEXT:"\n "]
<foo1 val="23"/>
[TEXT:"\n "]
<foo2 val="14"/>
[TEXT:"\n "]
<foo3 val="5"/>
[TEXT:"\n "]
</children>
[TEXT:"\n"]
</root>
另一种方法是让 libxml2 为您自动缩进输出。这将破坏现有的缩进并从头开始重做。 Here是一个相关的答案。
关于c - 新 child 的 xml 缩进和换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30500827/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
使用Redcarpet,当我在Markdown中包含类似以下内容时,它不考虑任何换行符或缩进。我在行尾尝试了两个空格。代码之间的额外行。似乎没有任何效果。```xml3```我明白了:3这里是Redcarpet设置:Redcarpet::Markdown.new(Redcarpet::Render::HTML,:autolink=>true,:space_after_headers=>true,:fenced_code_blocks=>true,:no_intra_emphasis=>true,:lax_html_blocks=>true)我需要做什么才能正确换行并保留缩进,就像这里或
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::
我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi
这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::
我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h
我正在尝试加载SAML协议(protocol)架构(具体来说:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作之后:schema=Nokogiri::XML::Schema(File.read('saml11_schema.xsd'))我得到这个输出:Nokogiri::XML::SyntaxErrorException:Element'{http://www.w3.org/2001/XMLSchema}element',att
有没有人见过treetop的vim缩进文件?,Ruby解析器/生成器?我找到了一个vim语法高亮文件,但还没有看到用于缩进的文件。 最佳答案 看起来很简单——我只是创建一个文件~/.vim/indent/treetop.vim并使其唯一的内容runtime!indent/ruby.vim它似乎可以支持我所需要的一切。我认为它只是没有加载Ruby的缩进文件! 关于ruby-Treetop的Vim缩进文件(Ruby解析器),我们在StackOverflow上找到一个类似的问题:
如何让Emacs自动重新缩进Ruby代码?例如,在Emacs中,defhelloputs"hello"en输入“d”后,我希望它变成这样,defhelloputs"hello"end这是Vim中的默认设置,但我如何在Emacs中实现它? 最佳答案 ruby-electric已经是旧闻了。Emacs24有一个名为electric-indent-mode的内置次要模式,它会在一些字符后自动插入换行符,你当然可以将RETURN键重新映射到newline-and-indent(默认只映射到缩进)。在Emacs24中,您可以使用electri
给定一个字符串,返回字符串中换行符开头的字符位置数组的最有效方法是什么?text=预期:find_newlines(text)#=>[0,80,155,233,313,393]我发布我自己的答案。我愿意接受最快的方式作为接受的答案。此处的基准测试结果将在添加新答案时更新require"fruity"comparedopadde1{find_newlines_padde1(text)}digitalross1{find_newlines_digitalross1(text)}sawa1{find_newlines1(text)}sawa2{find_newlines2(text)}end