jjzjj

c - 新 child 的 xml 缩进和换行符

coder 2024-06-29 原文

我有一个如下所示的 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的末尾添加一个额外的元素节点, 你可以看到你得到的是不可避免的(因为没有文本节点来携带换行符和 foo3children 之间所需的缩进)。

您需要编辑 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/

有关c - 新 child 的 xml 缩进和换行符的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 代码块中的 Markdown 换行符 - 2

    使用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)我需要做什么才能正确换行并保留缩进,就像这里或

  3. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用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::

  4. ruby - 如何使用 Nokogiri::XML::Builder 生成动态标签? - 2

    我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi

  5. ruby - 如何让 Nokogiri 解析并返回 XML 文档? - 2

    这是一些奇怪的例子:#!/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::

  6. Ruby 无法检测字符串中的换行符 - 2

    我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h

  7. ruby - 模式加载时出现 Nokogiri::XML::Schema SyntaxError - 2

    我正在尝试加载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

  8. ruby - Treetop 的 Vim 缩进文件(Ruby 解析器) - 2

    有没有人见过treetop的vim缩进文件?,Ruby解析器/生成器?我找到了一个vim语法高亮文件,但还没有看到用于缩进的文件。 最佳答案 看起来很简单——我只是创建一个文件~/.vim/indent/treetop.vim并使其唯一的内容runtime!indent/ruby.vim它似乎可以支持我所需要的一切。我认为它只是没有加载Ruby的缩进文件! 关于ruby-Treetop的Vim缩进文件(Ruby解析器),我们在StackOverflow上找到一个类似的问题:

  9. ruby - 在 emacs 中即时缩进 ruby​​ 代码 - 2

    如何让Emacs自动重新缩进Ruby代码?例如,在Emacs中,defhelloputs"hello"en输入“d”后,我希望它变成这样,defhelloputs"hello"end这是Vim中的默认设置,但我如何在Emacs中实现它? 最佳答案 ruby-electric已经是旧闻了。Emacs24有一个名为electric-indent-mode的内置次要模式,它会在一些字符后自动插入换行符,你当然可以将RETURN键重新映射到newline-and-indent(默认只映射到缩进)。在Emacs24中,您可以使用electri

  10. ruby - 换行位置 - 2

    给定一个字符串,返回字符串中换行符开头的字符位置数组的最有效方法是什么?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

随机推荐