Синтаксический анализ XML-подобных данных

#php #xml #regex

#php #xml #регулярное выражение

Вопрос:

У меня есть строка с XML-подобными данными:

 <header>Article header</header>
<description>This article is about you</description>
<text>some <b>html</b> text</text>
  

Мне нужно разобрать его на переменные / объект / массив «заголовок», «описание», «текст».

Каков наилучший способ сделать это? Я пытался $vars = simplexml_load_string($content) , но это не работает, потому что это не 100% чистый xml (нет <?xml... ).
Итак, я должен использовать preg_match ? Это единственный способ?

Комментарии:

1. Это не xml. Так simplexml не работает.

Ответ №1:

Ваша строка XML выглядит как (хотя может быть или не быть) фрагмент XML-документа. PHP может работать с этим с помощью DOMDocumentFragment класса.

 $doc  = new DOMDocument;
$frag = $doc->createDocumentFragment();
$frag->appendXML($content);

$parsed = array();
foreach ($frag->childNodes as $element) {
    if ($element->nodeType === XML_ELEMENT_NODE) {
        $parsed[$element->nodeName] = $element->textContent;
    }
}

echo $parsed['description']; // This article is about you
  

Ответ №2:

С такой строкой simlexml_load_string должен работать.

Из-за 3-го тега, если вы попытаетесь получить это, он завершится неудачей и не вернет правильное значение (потому что в теге есть вспомогательная часть.

Попробуйте что-то подобное, что может сработать для вас:

 $xml = simplexml_load_string($content)
$text = $xml->text->asXML();
  

Вы также должны взглянуть на эту документацию: http://www.php.net/manual/en/simplexmlelement.asxml.php . Они также делают то же самое со строкой. Возможно, вы захотите использовать эту опцию вместо simplexml_load_string too

 $xml = new SimpleXMLElement($string);
  

Комментарии:

1. simplexml_load_string выдает ошибку, когда отсутствует <?xml > элемент верхнего уровня или. SimpleXMLElement может быть, так и нужно поступить.