过滤XML文件,使用PHP


Filtering XML file, with PHP

我想加载XML文件,然后删除所有<Charge>,其中<DispositionDate>大于/大于7年。日期格式为YYYY-MM-DD。

XML的例子:

<BackgroundReports userId="" password="" account="" >
    <BackgroundReportPackage>
        <Screenings>
            <Screening type="criminal" qualifier="">
                <CriminalReport>
                    <CriminalCase>
                        <AgencyReference type="Docket">
                            <IdValue>CR-0870120-09</IdValue>
                        </AgencyReference>
                        <Charge>
                            <ChargeId>
                                <IdValue>1</IdValue>
                            </ChargeId>
                            <ChargeOrComplaint>DUI: HIGHEST RTE OF ALC (BAC .16+) 1ST OFF</ChargeOrComplaint>
                            <ChargeTypeClassification>unknown</ChargeTypeClassification>
                            <DispositionDate>2009-04-07</DispositionDate>
                        </Charge>
                        <Charge>
                            <ChargeId>
                                <IdValue>2</IdValue>
                            </ChargeId>
                            <ChargeOrComplaint>CARELESS DRIVING</ChargeOrComplaint>
                            <ChargeTypeClassification>unknown</ChargeTypeClassification>
                            <DispositionDate>2010-08-02</DispositionDate>
                        </Charge>
                        <Charge>
                            <ChargeId>
                                <IdValue>3</IdValue>
                            </ChargeId>
                            <ChargeOrComplaint>STATUTE: 475 PC</ChargeOrComplaint>
                            <ChargeTypeClassification>misdemeanor</ChargeTypeClassification>
                            <OffenseDate>1988-11-05</OffenseDate>
                            <Disposition>CONVICTED</Disposition>
                            <DispositionDate>1988-11-09</DispositionDate>
                            <DispositionDate>1988-11-05</DispositionDate>
                            <DispositionDate>1988-11-09</DispositionDate>
                        </Charge>
                    </CriminalCase>
                </CriminalReport>
            </Screening>
        </Screenings>
    </BackgroundReportPackage>
</BackgroundReports>

我知道如何使用PHP打开和关闭/保存文件,我不知道如何删除我不想要的部分…如果有人能帮我,我会非常感激!

可以使用SimpleXML、DOM或XSL。

示例XML(为简洁而缩短(来自您的问题的修订1)):

$xml = <<< XML
<CriminalCase>
    <Charge>
        <DispositionDate>1995-12-21</DispositionDate>
    </Charge>
    <Charge>
        <DispositionDate>2010-12-21</DispositionDate>
    </Charge>
</CriminalCase>
XML;

用SimpleXml

$sevenYearsAgo = new DateTime('-7 years');
$CriminalCase  = new SimpleXmlElement($xml);
for ($i = 0; $i < $CriminalCase->Charge->count(); $i++) {
    $dispositionDate = new DateTime($CriminalCase->Charge->DispositionDate);
    if ($dispositionDate < $sevenYearsAgo) {
        unset($CriminalCase->Charge[$i]);
    }
}
echo $CriminalCase->asXml();

与DOM

$dom = new DOMDocument;
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
$oldCases = $xpath->query(
    sprintf(
        '//Charge[substring-before(DispositionDate, "-") < %d]',
        date('Y', strtotime('-7 years'))
    )
);
foreach ($oldCases as $oldCase) {
    $oldCase->parentNode->removeChild($oldCase);
}
echo $dom->saveXml();

与XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:date="http://exslt.org/dates-and-times"
                extension-element-prefixes="date">
  <xsl:output indent="yes" method="xml"/>
  <xsl:template match="/">
    <CriminalCase>
      <xsl:apply-templates />
    </CriminalCase>      
  </xsl:template>
  <xsl:template match="Charge">
    <xsl:if test="date:year(DispositionDate) &gt; date:year() - 7">
      <xsl:copy-of select="."/>
    </xsl:if>
  </xsl:template>   
</xsl:stylesheet>

,然后使用以下PHP代码对其进行转换

$doc = new DOMDocument();
$xsl = new XSLTProcessor();
$doc->loadXml($xsl);
$xsl->importStyleSheet($doc);
$doc->loadXml($xml);
echo $xsl->transformToXML($doc);

这里有一些关于如何开始的提示:

  1. 您需要将XML解析为更容易处理的内容。PHP有一个叫做SimpleXML的库。
  2. 循环遍历数据并删除超过7年的对象。要比较日期,必须首先将从XML获得的日期转换为PHP可以处理的日期。看看strtotime,它给你时间戳(从1970年开始的秒数,实际上是1901版本> 5.1.0)或DateTime,它支持1970年之前的日期。
  3. 要检查获取的日期是否大于7年前,您需要(一种方式)用当前时间戳减去时间戳,并查看该值是否大于7年(以秒为单位)。或者如果您使用DateTime,您可以查看DateTime::diff。删除迭代超过7年的对象(未设置)。
  4. 要再次保存为XML,请查看SimpleXMLElement::asXML

希望有帮助!