使用PHP过滤XML文件

时间:2011-10-18 16:32:37

标签: php xml

我想加载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打开和关闭/保存文件,我不知道如何删除我不想要的部分...如果有人会帮助我,我会非常感谢!

2 个答案:

答案 0 :(得分:4)

您可以使用SimpleXMLDOMXSL

示例XML(shortened for brevity (from Revision 1 of your question)):

$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 :(得分:1)

以下是有关如何入门的一些提示:

  1. 您需要将XML解析为更容易使用的东西。 PHP有一个名为SimpleXML的库。
  2. 循环浏览数据并删除超过7年的对象。要比较日期,您必须首先将从XML获得的日期转换为PHP可以作为日期处理的日期。看一下strtotime,它会给你时间戳(自1970年以来的秒数,实际上是1901年版本&gt; 5.1.0)或DateTime,它支持1970年以前的日期。
  3. 要检查提取日期是否早于7年前,您需要(单向)使用当前时间戳减去时间戳,并查看该值是否大于7年(以秒为单位)。或者,如果您使用DateTime,则可以查看DateTime::diff。删除迭代超过7年的对象(unset)。
  4. 要再次保存为XML,请查看SimpleXMLElement::asXML
  5. 希望有所帮助!