Вопрос по обработке xml

tikhon_shw

Новичок
Вопрос по обработке xml

как таковой вопрос понятен как их обрабатывать, но вот мне попался файл xml в интересном виде (обработать не получилось!!!)

пример:
<Файл>
<ИмяФайла>00000.XML</ИмяФайла>
<ЗаголовокФайла>
<ВерсияФормата>07.00</ВерсияФормата>
<ТипФайла>ВНЕШНИЙ</ТипФайла>
<ПрограммаПодготовкиДанных>
<НазваниеПрограммы>ПФ-ОТЧЕТ XML</НазваниеПрограммы>
<Версия>07.07.01</Версия>
</ПрограммаПодготовкиДанных>
<ИсточникДанных>СТРАХОВАТЕЛЬ</ИсточникДанных>
</ЗаголовокФайла>
</Файл>

кто может подсказать как его обработать!!!!!
очень надо но не получается!!!!
 

A1x

Новичок
так DOM'ом. только кодировку в заголовке указать
 

tikhon_shw

Новичок
Автор оригинала: A1x
так DOM'ом. только кодировку в заголовке указать
<?xml version="1.0" encoding="windows-1251" ?>

вариант не прошел
1.XML - содержит данные что были выше
<?
include '1.XML';
$xml = new SimpleXMLElement($xmlstr);
echo $xml->Файл->ИсточникДанных;
?>

вариант не прошел
<?
$dom = new domDocument;

$dom->loadXML('<Файл><ИмяФайла>00000.XML</ИмяФайла><ЗаголовокФайла><ВерсияФормата>07.00</ВерсияФормата>
<ТипФайла>ВНЕШНИЙ</ТипФайла>
<ПрограммаПодготовкиДанных>
<НазваниеПрограммы>ПФ-ОТЧЕТ XML</НазваниеПрограммы>
<Версия>07.07.01</Версия>
</ПрограммаПодготовкиДанных>
<ИсточникДанных>СТРАХОВАТЕЛЬ</ИсточникДанных>
</ЗаголовокФайла>
</Файл>');
if (!$dom) echo 'Error';
$s = simplexml_import_dom($dom);
echo $s->Файл->ИсточникДанных;
?>

если где не прав поправьте пожалуйста
 

slach

Новичок
echo $xml->Файл->ИсточникДанных; в какой кодировке?? в utf8 ?

getElementByTagName для второго варианта попробуй...
 

A1x

Новичок
Зачем вы после того как загрузили в хмл в domDocument импортируете его в SimpleXML? SimpleXML работать не будет с русскими именами или надо как-то извращаться. Извлекайте данные просто из domDocument

а заголовок?
может лучше так
Код:
$doc = new DOMDocument();
$doc->load($fname);
ЗЫ зачем там include '1.XML';?
 

tikhon_shw

Новичок
to slach:
кодировку не меняю
________________________
содержимое 1.XML:
<?php
$xmlstr = <<<XML
.
.
.
XML;
?>
поэтому так include '1.XML'.. делаю просто навскидку для теста...
 

mity

Новичок
Дело здесь не в кодировках

Просто стандартные парсеры не поддерживают русские буквы в именах параметров, Пишите свой парсер, примеры написания в интернете есть.

И так писать нельзя
echo $s->Файл->ИсточникДанных;
переменные в php могут называться только по латински
 

A1x

Новичок
или в конструкторе можно кодировку указать
$dom = new DOMDocument('1.0', 'utf-8');
потом getElementsByTagName
 

tikhon_shw

Новичок
вот я так думаю.. фигня какая-то а не файлик для обработки второй день над ним бьюсь ничего не выходит

при варианте
$doc = new DOMDocument();
$doc->load($fname);
if (!$dom) echo 'Error';
сразу вываливается в ошибку
 

mity

Новичок
A1x, Действительно поддерживает

Предварительно надо с конвертировать в UTF-8
PHP:
$data = "<Файл>
<ИмяФайла>00000.XML</ИмяФайла> 
<ЗаголовокФайла>
<ВерсияФормата>07.00</ВерсияФормата> 
<ТипФайла>ВНЕШНИЙ</ТипФайла> 
<ПрограммаПодготовкиДанных>
<НазваниеПрограммы>ПФ-ОТЧЕТ XML</НазваниеПрограммы> 
<Версия>07.07.01</Версия> 
</ПрограммаПодготовкиДанных>
<ИсточникДанных>СТРАХОВАТЕЛЬ</ИсточникДанных> 
</ЗаголовокФайла> 
</Файл>";

//==================================================================================
class MyDOMDocument extends DOMDocument
{
    public function toArray(DOMNode $oDomNode = null)
    {
        // return empty array if dom is blank
        if (is_null($oDomNode) && !$this->hasChildNodes()) {
            return array();
        }
        $oDomNode = (is_null($oDomNode)) ? $this->documentElement : $oDomNode;
        if (!$oDomNode->hasChildNodes()) {
            $mResult = $oDomNode->nodeValue;
        } else {
            $mResult = array();
            foreach ($oDomNode->childNodes as $oChildNode) {
                // how many of these child nodes do we have?
                // this will give us a clue as to what the result structure should be
                $oChildNodeList = $oDomNode->getElementsByTagName($oChildNode->nodeName);  
                $iChildCount = 0;
                // there are x number of childs in this node that have the same tag name
                // however, we are only interested in the # of siblings with the same tag name
                foreach ($oChildNodeList as $oNode) {
                    if ($oNode->parentNode->isSameNode($oChildNode->parentNode)) {
                        $iChildCount++;
                    }
                }
                $mValue = $this->toArray($oChildNode);
                $sKey   = ($oChildNode->nodeName{0} == '#') ? 0 : $oChildNode->nodeName;
                $mValue = is_array($mValue) ? $mValue[$oChildNode->nodeName] : $mValue;
                // how many of thse child nodes do we have?
                if ($iChildCount > 1) {  // more than 1 child - make numeric array
                    $mResult[$sKey][] = $mValue;
                } else {
                    $mResult[$sKey] = $mValue;
                }
            }
            // if the child is <foo>bar</foo>, the result will be array(bar)
            // make the result just 'bar'
            if (count($mResult) == 1 && isset($mResult[0]) && !is_array($mResult[0])) {
                $mResult = $mResult[0];
            }
        }
        // get our attributes if we have any
        $arAttributes = array();
        if ($oDomNode->hasAttributes()) {
            foreach ($oDomNode->attributes as $sAttrName=>$oAttrNode) {
                // retain namespace prefixes
                $arAttributes["@{$oAttrNode->nodeName}"] = $oAttrNode->nodeValue;
            }
        }
        // check for namespace attribute - Namespaces will not show up in the attributes list
        if ($oDomNode instanceof DOMElement && $oDomNode->getAttribute('xmlns')) {
            $arAttributes["@xmlns"] = $oDomNode->getAttribute('xmlns');
        }
        if (count($arAttributes)) {
            if (!is_array($mResult)) {
                $mResult = (trim($mResult)) ? array($mResult) : array();
            }
            $mResult = array_merge($mResult, $arAttributes);
        }
        $arResult = array($oDomNode->nodeName=>$mResult);
        return $arResult;
    }
}

//========================================================================================
$dom = new MyDOMDocument;
$dom->loadXml($data);

echo "<pre>";
print_r($dom->toArray());
echo "<pre>";
 

tikhon_shw

Новичок
добавил
$data = iconv('windows-1251','utf-8',$data);

!!!!!! выводит массив !!!!!!!

а по структуре:
echo $dom->Файл->ИмяФайла
можно получать данные?!
 

mity

Новичок
Например так
PHP:
$ar=$dom->toArray();
echo $ar["Файл"]["ИмяФайла"]."  ".$ar["Файл"]["ЗаголовокФайла"]["ВерсияФормата"];
 

A1x

Новичок
DOM поддерживает, simplexml врядли
если точнее, то стандарт ХМЛ вообще позволяет использовать в именах элементов любые символы, хоть иероглифы.
Другое дело что если вы загоните это в SimpleXML то вы оттуда это не вытянете так как пхп разрешает только латинские символы в полях объектов

tikhon_shw, mity не надо ничего конвертировать, просто укажите DOM кодировку входных данных и он сам сконвертирует все в utf-8 (это его внутренняя кодировка)
 

mity

Новичок
tikhon_shw
В том примере который я дал сначала допишите снизу

$ar=$dom->toArray();
echo $ar["Файл"]["ИмяФайла"]." ".$ar["Файл"]["ЗаголовокФайла"]["ВерсияФормата"];

И сохраните файл в формате UTF-8, и всё будет прекрасно выводится

Или каждый раз переконвертируйте
PHP:
echo $ar[ iconv('windows-1251','utf-8',"Файл")][iconv('windows-1251','utf-8',"ИмяФайла")]
Ну или измените функцию toArray, чтобы она сама переконвертировала
 

Splurov

Новичок
Автор оригинала: mity
переменные в php могут называться только по латински
нет:
PHP:
<?php

header('Content-Type: text/plain; charset=UTF-8');

$тестовая_переменная = 'значение переменной';

echo $тестовая_переменная . PHP_EOL;

$данные = new stdclass;
$данные->тестовое_свойство = 'значение свойства';

echo $данные->тестовое_свойство;
 

A1x

Новичок
Splurov
ого нифига себе... это ж если про это узнают индусы и начнут писать свой код на своем санскрите.. )))
 

tikhon_shw

Новичок
продолжение вопроса
задаю цикл чтоб скаждым проход открывался новый файл

выдает ошибку
Fatal error: Cannot redeclare class MyDOMDocument in C:\apache\localhost\www\XML\index.php

подскажите как ее победить
 
Сверху