从一个步骤中删除XML中没有空行的元素(使用PHP)

时间:2015-09-04 15:25:57

标签: php xml

我有一个XML,我删除了一些元素。之后我得到一些空行,所以我采取第二步,用preserveWhiteSpace = false删除它们。

我的代码现在是这样的:

<?php
// erase elements
$docX->loadXML("events.xml");

$docX = new SimpleXMLElement($docX);

for ($o = count($docX->event); $o >= 0 ; $o--) {
  if ($docX->event[$o]->typ == 'old') {
    unset($docX->event[$o]);
  }
}

file_put_contents("events_new.xml", $docX->saveXML());
// clean blank lines
$file = "events_new.xml";
$fp = fopen($file, "rb") or die("cannot open file");
$str = fread($fp, filesize($file));
$xml = new DOMDocument();

$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->loadXML($str) or die("Error");

file_put_contents("events_new.xml", $xml->saveXML());
?>

是否可以一步完成?

1 个答案:

答案 0 :(得分:1)

我认为这是您earlier question的后续行动。因此,我通常建议使用XSLT解决方案进行任何XML操作。 XSLT是一种特殊用途的声明性语言,可将XML文件转换为任何所需的格式。大多数编程语言包括PHP(取消注释.ini文件中的XSL扩展),Java,C,Python,VBA维护XSLT库。

您可以在.xsl文件中外部加载XSLT,也可以在内部加载XSLT作为字符串,如下例所示DOMDocument。请注意剥离空格和缩进的行。考虑此路线的另一个原因是,解析XML文件比过滤节点值(即分组元素,分配新ID,按属性过滤)更复杂:

// Load the XML source
$xml = new DOMDocument;
$xml->load('events.xml');

// Load the XSL string
$xsl = new DOMDocument;
$xslstr = "<?xml version=\"1.0\"?>
             <xsl:stylesheet version=\"1.0\" 
                   xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">

             <xsl:strip-space elements=\"*\" />
             <xsl:output method=\"xml\" indent=\"yes\" encoding=\"UTF-8\" />

             <xsl:template match=\"events\">    
                <xsl:element name=\"event\">    
                  <xsl:for-each select=\"event/typ[text()='new']\">       
                      <xsl:copy-of select=\"..\"/>       
                  </xsl:for-each>    
                </xsl:element>   
              </xsl:template>

           </xsl:stylesheet>";

$xsl->loadXML($xslstr);

// Configure the transformer
$proc = new XSLTProcessor;
// attach the XSL rules
$proc->importStyleSheet($xsl); 

// Transform XML source
$newXml = $proc->transformToXML($xml);

// Save output to file
file_put_contents('events_new.xml', $newXml);