Как получить все элементы XML определенного пространства имен с их тегами? - PullRequest
0 голосов
/ 03 января 2011

Я не могу найти конкретный вопрос, как этот, поэтому я пишу.Надеюсь, это будет общего назначения.

У меня есть файл, который содержит XML-теги "<w:t> data data.....</w:t>".Есть много других вещей тоже.Мне нужно захватить все внутри (включая) теги <w:t></w:t>.

Буду признателен за предложения о том, как поступить.

Заранее спасибо ..

David

Ответы [ 3 ]

1 голос
/ 04 января 2011

Добавляя к предыдущему ответу, я добавляю 's' в нижнем регистре после i в конце, чтобы позаботиться о переносе строки.

Хороший вопрос от мистера Гамбо ниже. Да, также добавьте «U» в верхнем регистре после «s», чтобы сделать выражение менее жадным, иначе оно не будет работать так, как ожидалось

, например

preg_match_all ('/.*<\/w \: t> / isU', $ строка, $ совпадений);

1 голос
/ 04 января 2011

Вы действительно должны использовать синтаксический анализатор XML DOM, например SimpleXML :

$string = '<?xml version="1.0"?>
<root xmlns:w="http://example.com/">
    <w:t>some data...</w:t>
    <not-captured>data data</not-captured>
    <w:t>more data...</w:t>
</root>';
$doc = simplexml_load_string($string);
foreach ($doc->xpath('//w:t') as $elem) {
    var_dump($elem->asXML());
}

Если вы не укажете пространство имен для w в своем XML-документе, используйте SimpleXMLElement :: registerXPathNamespace :

$doc->registerXPathNamespace('w', 'http://example.com/');
0 голосов
/ 04 января 2011

Использование DomXml является предпочтительным вариантом, поскольку он не ограничивает вас в поиске других тегов / данных.

Но использование регулярных выражений делает намного меньше кода, поэтому я бы выбрал preg_match_all, если эти теги - единственное, что вам нужно.

$string = '<?xml version="1.0"?>
<root>
    <w:t>some data...</w:t>
    <not-captured>data data</not-captured>
    <w:t>more data...</w:t>
</root>
</xml>';

preg_match_all('/<w\:t>.*<\/w\:t>/is', $string, $matches);
var_dump($matches);

Ответ:

array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(23) "<w:t>some data...</w:t>"
    [1]=>
    string(23) "<w:t>more data...</w:t>"
  }
}

Редактировать: / добавлен модификатор в регулярное выражение

...