0

如何使用 xpath 将 xml 转换为另一种 xml 格式?xml 文件是动态的,它可以是任何级别,不同的标签。以下 xml 是一个示例:

<?xml version="1.0"?> 
<student_info>     
<total_stud>500</total_stud>     
  <student>         
    <id>1</id>         
    <name>abc</name>         
    <address>             
       <city>Pune</city>             
       <zip>411006</zip>         
    </address>     
  </student>     
  <student>         
    <id>1</id>         
    <name>bbc</name>         
    <address>             
      <city>Toronto</city>             
      <zip>82233</zip>         
    </address>     
  </student> 
  <student>         
    <id>2</id>         
    <name>wec</name>         
    <address>             
      <city>North York</city>             
      <zip>59522</zip>         
    </address>     
  </student> 
</student_info> 

致:所有学生“id=1”

<?xml version="1.0"?>
<student_info>
  <student>
    <name>abc</name>
    <city>Pune</city>             
    <zip>411006</zip>      
  </student> 
  <student>
    <name>bbc</name>
    <city>Toronto</city>             
    <zip>82233</zip>      
  </student>
</student_info>
4

2 回答 2

2

您可能想要使用有助于 XPath 的 XSL 转换。

您可以像这样从 PHP 中使用它:http ://www.php.net/manual/en/book.xsl.php

您的示例的 XSL 可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>

  <xsl:param name="id" />

  <xsl:template match="/student_info">
    <xsl:copy>
      <xsl:apply-templates select=".//student[id=$id]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="student">
    <xsl:copy>
      <xsl:copy-of select="name" />
      <xsl:copy-of select="address/city" />
      <xsl:copy-of select="address/zip" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

您可以使用和将id参数(与样式表一起使用)传递给转换器。<xsl:param>$idsetParameter

编辑:这里有一块 xsltCake 可以玩:http ://www.xsltcake.com/slices/dnuFXh 不幸的是它不支持参数。

于 2012-07-07T23:17:01.350 回答
1

试试这个:

// 将其保存在一个文件中:ts1.xml

<?xml version="1.0" encoding="utf-8"?>
<student_info>     
    <total_stud>500</total_stud>     
  <student>         
    <id>1</id>         
    <name>abc</name>         
    <address>             
       <city>Pune</city>             
       <zip>411006</zip>         
    </address>     
  </student>     
  <student>         
    <id>1</id>         
    <name>bbc</name>         
    <address>             
      <city>Toronto</city>             
      <zip>82233</zip>         
    </address>     
  </student> 
  <student>         
    <id>2</id>         
    <name>wec</name>         
    <address>             
      <city>North York</city>             
      <zip>59522</zip>         
    </address>     
  </student> 
</student_info>

PHP代码在这里:

<?php
$xml = simplexml_load_file( 'ts1.xml' );

// search all nodes with id=1
$xpath = ( $xml->xpath( '//student/id[.=1]/..' ) );

// create a new XML
$newXML = simplexml_load_string( "<?xml version=\"1.0\" encoding=\"utf-8\"?><student_info></student_info>" );

// add matching xml nodes to it.
foreach( $xpath as $st ) {
    $student = $newXML->addChild( 'student' );
    $student->addChild( 'name', (string)$st->name );
    $student->addChild( 'city', (string)$st->address->city );
    $student->addChild( 'zip', (string)$st->address->zip );
}

$xmldoc = new DomDocument( '1.0' );
$xmldoc->preserveWhiteSpace = false;
$xmldoc->formatOutput = true;

$xmldoc->loadXML( $newXML->asXML(), LIBXML_NOBLANKS );
//save as 1.xml
$xmldoc->save( '1.xml' );
?>

结果保存在 1.xml

<?xml version="1.0" encoding="utf-8"?>
<student_info>
  <student>
    <name>abc</name>
    <city>Pune</city>
    <zip>411006</zip>
  </student>
  <student>
    <name>bbc</name>
    <city>Toronto</city>
    <zip>82233</zip>
  </student>
</student_info>

这将为所有 id=1 的节点创建一个新的 xml。您可以修改它以满足您的需要。希望这可以帮助。

于 2012-07-04T07:08:06.973 回答