使用Perl解析XML

use*_*632 2 xml perl libxml2 xml-libxml

总菜鸟在这里,所以我很抱歉我提前无知.

我搜索和搞砸的大部分内容都集中在使用XML::LibXMLXPath.

我遇到的问题是我不想在标签之间捕获文本:我需要标签的值.

这是我的XML结构

<users>
  <entry name="asd">
    <permissions>
      <role-based>
        <superuser>yes</superuser>
      </role-based>
    </permissions>
  </entry>
  <entry name="fgh">
    <permissions>
      <role-based>
        <superuser>yes</superuser>
      </role-based>
    </permissions>
    <authentication-profile>RSA Two-Factor</authentication-profile>
  </entry>
  <entry name="jkl">
    <permissions>
      <role-based>
        <superreader>yes</superreader>
      </role-based>
    </permissions>
    <authentication-profile>RSA Two-Factor</authentication-profile>
  </entry>
</users>
Run Code Online (Sandbox Code Playgroud)

我试图获取name属性(不带引号),并确定此人是超级用户还是超级读者.

除了打印节点之外,我无法做很多事情.我需要将其转换为用户名结构中的CSV文件; 角色

nwe*_*hof 5

从XML文档中提取信息的最简单方法XML::LibXML是使用find一系列方法.这些方法使用XPath表达式从文档中选择节点和值.以下脚本提取您需要的数据:

use XML::LibXML;

my $doc = XML::LibXML->load_xml(location => 'so.xml');

for my $entry ($doc->findnodes('//entry')) {
    my $name = $entry->getAttribute('name');
    my $role = $entry->findvalue(
        'local-name(permissions/role-based/*[.="yes"])'
    );
    print("$name;$role\n");
}   
Run Code Online (Sandbox Code Playgroud)

它打印

asd;superuser
fgh;superuser
jkl;superreader
Run Code Online (Sandbox Code Playgroud)

我使用local-nameXPath函数获取角色元素的名称.

请注意,您可能希望使用Text::CSV更健壮的方式创建CSV文件.

  • @ user2891632,如果您仍然遇到问题,请发一个新问题,显示您正在使用的实际代码以及您获得的错误. (2认同)