2017-12-08 9 views
0

Ich bin mir bewusst, es gibt viele ähnliche Beiträge, jedoch konnte ich keine der Vorschläge erfolgreich implementieren.Parse XML-Namespace und Schema in PHP

Ich habe folgenden Auszug von Daten - XML ​​mit zwei Datensätze verfügbar here:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
    <message:MessageGroup xmlns:message="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message" xmlns:common="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/common" xmlns:frb="http://www.federalreserve.gov/structure/compact/common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message SDMXMessage.xsd http://www.federalreserve.gov/structure/compact/common frb_common.xsd"> 

     <?frb EmbargoDate="2017-10-24T00:00:00"?>  

    <frb:DataSet id="Yields" xmlns:kf="http://www.federalreserve.gov/structure/compact/Yields_Yields" xsi:schemaLocation="http://www.federalreserve.gov/structure/compact/Yields_Yields Yields_Yields.xsd"> 
    </frb:DataSet> 

    <frb:DataSet id="Yields" xmlns:kf="http://www.federalreserve.gov/structure/compact/Yields_Parameters" xsi:schemaLocation="http://www.federalreserve.gov/structure/compact/Yields_Parameters Yields_Parameters.xsd"> 
    <kf:Series BT="Nominal" CURRENCY="NA" FREQ="9" Parameter="B0" SERIES_NAME="BETA0" UNIT="Number" UNIT_MULT="1"> 
     <frb:Annotations> 
     <common:Annotation> 
      <common:AnnotationType>Short Description</common:AnnotationType> 
      <common:AnnotationText>Beta0 Coefficient for Nominal Treasury Yields as Estimated by the Svensson Term Structure Model</common:AnnotationText> 
     </common:Annotation> 
     </frb:Annotations> 
     <frb:Obs OBS_STATUS="A" OBS_VALUE="3.91760612" TIME_PERIOD="1961-06-14"/> 
     <frb:Obs OBS_STATUS="A" OBS_VALUE="3.97849787" TIME_PERIOD="1961-06-15"/> 
     <frb:Obs OBS_STATUS="A" OBS_VALUE="3.98435045" TIME_PERIOD="1961-06-16"/> 
     <frb:Obs OBS_STATUS="A" OBS_VALUE="4.00437935" TIME_PERIOD="1961-06-19"/> 
     <frb:Obs OBS_STATUS="A" OBS_VALUE="3.98578922" TIME_PERIOD="1961-06-20"/> 
     <frb:Obs OBS_STATUS="A" OBS_VALUE="4.00405894" TIME_PERIOD="1961-06-21"/> 
     <frb:Obs OBS_STATUS="A" OBS_VALUE="4.00089634" TIME_PERIOD="1961-06-22"/> 
    </kf:Series> 
    </frb:DataSet> 
</message:MessageGroup> 

YieldsParameters.xsd Datei extrahiert:

xmlns:frb="http://www.federalreserve.gov/structure/compact/common"> 
<xs:import namespace="http://www.federalreserve.gov/structure/compact/common" schemaLocation="frb_common.xsd"/> 

Ich bin daran interessiert, die OBS_VALUE und TIME_PERIOD Attribute in Abrufen aus dem 2. Datensatz. Ich möchte auch die Beobachtungen innerhalb der Reihen zählen.

Mit dem following suggestion meine Code-Beispiel sieht wie folgt aus:

$myFileXml = 'feds200628.xml'; 
$xml = simplexml_load_file($myFileXml); 

$xml->DataSet[1]->Series[0] as $Ser 
$ns_dc = $Ser ->children('http://www.federalreserve.gov/structure/compact/common'); 
echo $ns_dc->Obs[0]->->Attributes()->OBS_VALUE; 

echo $count = count($xml->children('http://www.federalreserve.gov/structure/compact/common',true)->DataSet[1]->Series[0]->Obs); 

bedenkt, dass ich abrufen nicht den Beobachtungswert und der Zählwert 0 zurück, ich glaube ich etwas sehr einfach hier fehle. Ich finde es auch komisch, dass

print_r($xml); 

kehrt:

SimpleXMLElement Object ([frb] => SimpleXMLElement Object() [Kommentar] => SimpleXMLElement Object())

Antwort

1

Es gibt einige Probleme mit der Methode, die Sie versuchen, verwendet diese Methode XPath, um die Daten nach Ihnen zu finden, und das entfernt viel von der Notwendigkeit, um das DOM zu verschieben, um Daten zu finden. Die Hauptsache mit XPath ist allerdings die Namensräume zu registrieren, damit Sie sie in der Abfrage verwenden ...

$myFileXml = 'feds200628.xml'; 
$xml = simplexml_load_file($myFileXml); 
$xml->registerXPathNamespace('frb', 'http://www.federalreserve.gov/structure/compact/common'); 
$xml->registerXPathNamespace('kf', "http://www.federalreserve.gov/structure/compact/Yields_Parameters"); 
$ns_dc = $xml->xpath("//frb:DataSet[2]/kf:Series[1]/frb:Obs"); 
echo $ns_dc[0]->Attributes()->OBS_VALUE.PHP_EOL; 
$count = count($ns_dc); 
echo $count.PHP_EOL; 

Die XPath gibt nur die Obs Elemente (Beachten Sie, dass XPath-Arrays 1 basiert sind, während PHP Arrays 0 sind basierend - weshalb verwende ich 2, um das zweite Element zu holen.

+0

perfekt, danke – bgolfb

+0

OK - können Sie diese Antwort akzeptieren, wenn es Ihr Problem löst. Vielen Dank –