我有一个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());
?>
是否可以一步完成?
答案 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);