【问题标题】:XML::Simple's "XMLout" method is converting attributes to elementsXML::Simple 的“XMLout”方法将属性转换为元素
【发布时间】:2013-06-21 23:14:18
【问题描述】:

我正在尝试使用 XML::Simple 更新一些 Java 应用程序的 server.xml 文件。虽然我能够很好地解析和更新对象,但 XMLout 的输出给我带来了一些麻烦。它似乎坚持将所有原始属性扩展为单个元素,这在我的 Java 应用程序启动时会感到困惑。

这是部分 XML 的示例:

<Server port="9000" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="9002" redirectPort="8443" enableLookups="false" protocol="AJP/1.3"     URIEncoding="UTF-8"/>
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>
</Service>
</Server>  

我通过XMLin做一个小改动:

$xml->XMLin("server.xml", ForceArray => ['Connector']);
$server_xml->{'port'} = $server_port;
$server_xml->{'Service'}->{'Connector'}->[0]->{'port'} = $http_port;

然后我像这样输出我的文件:

XMLout($server_xml, RootName => 'Server',  KeepRoot => 0, NoAttr => 1, OutputFile => "server.xml");

在 Data::Dumper 中一切似乎都运行良好并且看起来不错,但是当我查看我的输出时,我现在有这样的 XML:

   <Server>
   <Listener>
   <SSLEngine>on</SSLEngine>
   <className>org.apache.catalina.core.AprLifecycleListener</className>
   </Listener>
   ...

我需要将所有内容都回滚,但尽管我尽了最大努力,但到目前为止我还是没有做到。

【问题讨论】:

    标签: xml perl server.xml


    【解决方案1】:

    使用 XML::Simple 进行输入已经够难了,但输出几乎是不可能的。我用XML::LibXML

    use XML::LibXML qw( );
    
    my $parser = XML::LibXML->new();
    my $doc = $parser->parse_file('server.xml');
    
    for my $server ($doc->findnodes('/Server')) {
       $server->setAttribute(port => $server_port);
    
       for my $connector ($server->findnodes('Service/Connector[0]') {
          $connector->setAttribute(port => $http_port);
       }
    }
    
    $doc->toFile('server.xml');
    

    【讨论】:

    • 太棒了。它将间距和 cmets 留在原处以及一切!谢谢!!!
    • 作为快速跟进。我现在如何将新条目附加到 Service/Connector[0] 数组?谢谢!
    • 要将连接器添加到服务,请使用XML::LibXML::Element-&gt;new('Connector') 创建连接器元素,找到要添加连接器的服务,然后使用$service-&gt;appendChild($connector)
    【解决方案2】:

    阅读 CPAN 上 XML::Simple 的文档,似乎XMLout 方法中的NoAttr =&gt; 1 选项导致属性转换为嵌套元素。

    引用relevant part

    NoAttr => 1 # in+out - 方便

    当与 XMLout() 一起使用时,生成的 XML 将不包含任何属性。所有哈希键/值都将表示为嵌套元素。

    【讨论】:

      【解决方案3】:

      我建议你像这样使用XML::Twig

      use XML::Twig;
      
      my $change_port = sub { $_->set_att( port => 1234 ) };
      
      my $twig = XML::Twig->new(
          twig_handlers => {
              'Server[@port]' => $change_port,
              'Connector[@port]' => $change_port,
          },
      );
      $twig->parsefile( 'server.xml' );
      $twig->print_to_file( 'server.xml' );
      

      【讨论】:

        猜你喜欢
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 2010-10-13
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多