删除xml ruby​​中的注释块

时间:2014-07-24 09:35:27

标签: ruby xml

我需要编写一个脚本,可以删除xml文件中的注释块,并将其保存回其目录。

    <Configure id="Server" class="org.eclipse.jetty.server.Server">

    <!-- =========================================================== -->
    <!-- Server Thread Pool                                          -->
    <!-- =========================================================== -->
    <Set name="ThreadPool">
      <!-- Default queued blocking threadpool -->
      <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
        <Set name="minThreads">10</Set>
        <Set name="maxThreads">10000</Set>
        <Set name="detailedDump">false</Set>
      </New>
    </Set>

    <!-- =========================================================== -->
    <!-- Set connectors                                              -->
    <!-- =========================================================== -->

      <!--
        <Call name="addConnector">
          <Arg>
              <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
                <Set name="host"><SystemProperty name="jetty.host" /></Set>
                <Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>
                <Set name="maxIdleTime">50000</Set>
                <Set name="Acceptors">2</Set>
                <Set name="statsOn">false</Set>
                <Set name="confidentialPort">8443</Set>
          <Set name="lowResourcesConnections">5000</Set>
          <Set name="lowResourcesMaxIdleTime">5000</Set>
              </New>
          </Arg>
        </Call>
      -->        
    <Call name="addConnector">
  <Arg>
      <New class="org.eclipse.jetty.server.bio.SocketConnector">
        <Set name="host"><SystemProperty name="jetty.host" /></Set>
        <Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>
        <Set name="maxIdleTime">50000</Set>
        <Set name="lowResourceMaxIdleTime">1500</Set>
        <Set name="statsOn">false</Set>
      </New>
  </Arg>
</Call>

    </Configure>

在这个xml上  我该如何只注释掉这个区块?

<!--
   <Call name="addConnector">
      <Arg>
       <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
         <Set name="host"><SystemProperty name="jetty.host" /></Set>
         <Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>
         <Set name="maxIdleTime">50000</Set>
         <Set name="Acceptors">2</Set>
         <Set name="statsOn">false</Set>
         <Set name="confidentialPort">8443</Set>
         <Set name="lowResourcesConnections">5000</Set>
         <Set name="lowResourcesMaxIdleTime">5000</Set>
      </New>
    </Arg>
  </Call>
 -->  

我试过这个但是

  require 'nokogiri'

file = File.read("jetty.xml")
xml = Nokogiri::XML(file)

#replace <!-- --> with a space 
xml.xpath("//comment()").each do |node|
    node.content =node.content.gsub!(/(^\D\W[<!\-\-}]\W[\-\->])/,' ')
end

File.open("newjetty.xml","w") do |f|
    f.write xml.to_xml
end

此代码仅删除注释

中的文本

输出:

     <!---->
        <!---->
        <!---->


 <Set name="ThreadPool">
      <!---->
      <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
        <Set name="minThreads">10</Set>
        <Set name="maxThreads">10000</Set>
        <Set name="detailedDump">false</Set>
      </New>
    </Set>

        <!---->
        <!---->
        <!---->

      <!---->

        <!---->

1 个答案:

答案 0 :(得分:0)

您应该删除节点,因为它是注释节点。您可以使用内部文本对其进行解析并重新添加。

require 'nokogiri'

file = File.read("jetty.xml")
xml = Nokogiri::XML(file)

#replace <!-- --> with a space 
xml.xpath("//comment()").each do |node|
    t = Nokogiri::XML::DocumentFragment.parse(node.content)
    node.add_next_sibling(t)
    node.remove
end

File.open("newjetty.xml","w") do |f|
    f.write xml.to_xml
end

在这里,您要解析评论内容,将其添加为下一个兄弟,并删除节点本身。

这基本上有效,但是只有字符串的内容也会被添加为节点,这使得它成为一个混合内容文档,你肯定不希望它用于jetty配置文件。

因此,还应该包含一些检查节点类型(文本与元素)并且仅包含元素的逻辑。