在Perl中使用XPath组织数据

时间:2012-06-25 18:12:07

标签: perl xpath

我正在使用这行代码从XML文件中获取两个数据条目

perl xmlPerl.pl zbxml.xml "//zabbix_export/templates/template/items/item/name/text() | //zabbix_export/templates/template/items/item/description/text()"

获取数据并垂直显示。例如:

  • name1
  • description1
  • name2
  • 内容描述

我在c#中使用了这个,并且有一些代码,所以它会像这样显示

  • name1 - description1
  • name2 - description2
  • name3 - (自那以后空白 不是描述)

描述中甚至有一些空白。这是c#代码,因为它可能会有所帮助。

XPathExpression expr;
        expr = nav.Compile("/zabbix_export/templates/template/items/item/name | /zabbix_export/templates/template/items/item/description");
        XPathNodeIterator iterator = nav.Select(expr);

        //Iterate on the node set
        List<string> listBox1 = new List<string>();
        listBox1.Clear();
        try
        {
            while (iterator.MoveNext())
            {

                XPathNavigator nav2 = iterator.Current.Clone();
               // nav2.Value;
                listBox1.Add(nav2.Value);
                Console.Write(nav2.Value);
                iterator.MoveNext();
                nav2 = iterator.Current.Clone();
                Console.Write("-" + nav2.Value + "\n");

好吧,我现在必须将它切换到Perl,我不确定是否应该尝试找一些Perl代码来做我需要的,或者如果这可以在XPath中完成?我试着看一些w3教程,但没找到我要找的东西。

谢谢!

编辑 - 我需要编辑我的xmlPerl.pl

的这一部分吗?
# print each node in the list
foreach my $node ( $nodeset->get_nodelist ) {
print XML::XPath::XMLParser::as_string( $node ) . "\n";
}

1 个答案:

答案 0 :(得分:1)

使用XPath无法完成。它可以通过XSL转换来完成:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="text()"/>

  <xsl:template match="item">
    <xsl:value-of select="concat(name,' - ',description,'&#x0d;&#x0a;')"/>
  </xsl:template>

</xsl:stylesheet>

应用此XSLT的简单Perl脚本可以解决这个问题 - 例如,请参阅this(或者应用XSLT的任何其他命令行实用程序,如msxsl.exe