Я борюсь здесь, потратил большую часть сегодняшнего дня, пытаясь разобрать XML-документ автоматического генерирования, экспортированный из отчетов Crystal, XML не очень хорош, поэтому, пожалуйста, держитесь за меня.
Файл, с которым я должен работать, имеет следующую структуру:
<?xml version="1.0" encoding="UTF-8" ?>
<FormattedReport xmlns = 'urn:crystal-reports:schemas' xmlns:xsi = 'http://www.w3.org/2000/10/XMLSchema-instance'>
<FormattedAreaPair Level="0" Type="Report">
<FormattedAreaPair Level="1" Type="Details">
<FormattedArea Type="Details">
<FormattedSections>
<FormattedSection SectionNumber="0">
<FormattedReportObjects>
FormattedReportObject xsi:type="CTFormattedField" Type="xsd:long" FieldName="{tblCon.ManifestNR}"><ObjectName>ManifestNR1</ObjectName>
<FormattedValue>1,907</FormattedValue>
<Value>1907.00</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField" Type="xsd:timeInstant" FieldName="{tblCon.ShippingDate}"><ObjectName>ShippingDate1</ObjectName>
<FormattedValue>14/04/2011</FormattedValue>
<Value>2011-04-14T00:00:00</Value>
</FormattedReportObject>
... so on and so forth ...
</FormattedReportObjects>
</FormattedSection>
</FormattedSections>
</FormattedArea>
</FormattedAreaPair>
<FormattedReportObjects>
FormattedReportObject xsi:type="CTFormattedField" Type="xsd:long" FieldName="{tblCon.ManifestNR}"><ObjectName>ManifestNR1</ObjectName>
<FormattedValue>1,907</FormattedValue>
<Value>1907.00</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField" Type="xsd:timeInstant" FieldName="{tblCon.ShippingDate}"><ObjectName>ShippingDate1</ObjectName>
<FormattedValue>14/04/2011</FormattedValue>
<Value>2011-04-14T00:00:00</Value>
</FormattedReportObject>
... so on and so forth ...
</FormattedReportObjects>
</FormattedSection>
</FormattedSections>
</FormattedArea>
</FormattedAreaPair>
<FormattedAreaPair Level="1" Type="Details">
<FormattedArea Type="Details">
<FormattedSections>
<FormattedSection SectionNumber="0">
<FormattedReportObjects>
FormattedReportObject xsi:type="CTFormattedField" Type="xsd:long" FieldName="{tblCon.ManifestNR}"><ObjectName>ManifestNR1</ObjectName>
<FormattedValue>1,907</FormattedValue>
<Value>1907.00</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField" Type="xsd:timeInstant" FieldName="{tblCon.ShippingDate}"><ObjectName>ShippingDate1</ObjectName>
<FormattedValue>14/04/2011</FormattedValue>
<Value>2011-04-14T00:00:00</Value>
</FormattedReportObject>
... so on and so forth ...
</FormattedReportObjects>
</FormattedSection>
</FormattedSections>
</FormattedArea>
</FormattedAreaPair>
<FormattedReportObjects>
FormattedReportObject xsi:type="CTFormattedField" Type="xsd:long" FieldName="{tblCon.ManifestNR}"><ObjectName>ManifestNR1</ObjectName>
<FormattedValue>1,907</FormattedValue>
<Value>1907.00</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField" Type="xsd:timeInstant" FieldName="{tblCon.ShippingDate}"><ObjectName>ShippingDate1</ObjectName>
<FormattedValue>14/04/2011</FormattedValue>
<Value>2011-04-14T00:00:00</Value>
</FormattedReportObject>
... so on and so forth ...
</FormattedReportObjects>
</FormattedSection>
</FormattedSections>
</FormattedArea>
</FormattedAreaPair>
</FormattedAreaPair>
</FormattedReport>
Итак, я пытаюсь вызвать функцию PHP, которая будет анализировать XML и в конечном итоге сохранять его в базе данных SQL.
например:
ManifestNR: 1903
Дата Доставки: 12/04/2011
CarrierID: TNT03
TrackingRef: 234234232
... и т.д. для каждой записи ...
поэтому я попытался сделать это с помощью DOM, а затем наткнулся на simpleXML, я прочитал несколько статей и искал здесь реализации, но я просто не могу получить доступ к данным в конечных узлах (или любых других). другие данные). Является ли simpleXML «нет-нет» с такими структурами?
Последний PHP, который я использую:
<?php
if (file_exists('tracking.xml')) {
$xml = simplexml_load_file('tracking.xml');
// print_r($xml);
foreach( $xml as $FormattedReport->FormattedAreaPair->FormattedAreaPair )
{
foreach($FormattedReport as $node->FormattedArea->FormattedSections->FormattedSection->FormattedReportObjects)
echo $node->FormattedReportObject->Value;
}
} else {
exit('Failed to open xml');
}
?>
Я пытался разобраться с основами, но все равно не повезло. Не отражает результат.
Спасибо за ваше время, ребята!
решаемые
Любой, кто находится в подобных обстоятельствах, имеет немного направления.
- игнорировать корневой узел, это ваша переменная $ по умолчанию при импорте строки / файла XML
- Если у вас есть вложенные группы, сначала создайте узел для родителя, например, $ xml-> FormattedAreaPair-> FormattedAreaPair как $ parentnode
- Использование вашего родительского узла в цикле через все дочерние элементы
- Если у вас есть поле атрибута, обращайтесь к нему следующим образом: (строка) $ node ['FieldName'])
- Сравните полученный атрибут со строкой, а затем обработайте результат.
- Хватит тянуть за волосы.
(простите за ужасное форматирование кода)
<?php
if (file_exists('tracking.xml')) {
$xml = simplexml_load_file('tracking.xml');
//print_r($xml);
foreach( $xml->FormattedAreaPair->FormattedAreaPair as $parentnode ) {
foreach($parentnode->FormattedArea->FormattedSections->FormattedSection->FormattedReportObjects->FormattedReportObject as $node){
//echo "FormattedValue: ".$node->FormattedValue."<br />";
switch((string) $node['FieldName']){
case '{tblCon.ManifestNR}':
echo 'Manifest: '.$node->FormattedValue."<br />";
break;
case '{tblCon.ShippingDate}':
echo 'Shipping Date: '.$node->FormattedValue."<br />";
break;
case '{tblCon.CarrierID}':
echo 'Carrier ID: '.$node->FormattedValue."<br />";
break;
case '{tblCon.CustConRefTX}':
echo 'Customer Reference: '.$node->FormattedValue."<br />";
break;
case '{tblCon.ServiceCodeTX}':
echo 'Service Code: '.$node->FormattedValue."<br />";
break;
case '{tblCon.TotalWeightNR}':
echo 'Total Weight: '.$node->FormattedValue."<br />";
break;
case '{tblCon.ValueNR}':
echo 'Value: '.$node->FormattedValue."<br />";
break;
case '{tblCon.TotalVolumeNR}':
echo 'Total Volume: '.$node->FormattedValue."<br />";
break;
case '{tblCon.GoodsDesc}':
echo 'Goods Description: '.$node->FormattedValue."<br />";
break;
case '{tblConAddr.ReceiverNameTX}':
echo 'Receiver Name: '.$node->FormattedValue."<br />";
break;
case '{@SalesOrder}':
echo 'Sales Order: '.$node->FormattedValue."<br />";
break;
case '{@TrackingReference}':
echo 'Tracking Reference: '.$node->FormattedValue."<br />";
break;
}
}
echo "---------------------------- <br />";
}
}
else {
exit('Failed to open xml');
}
?>