2011-01-03 2 views
0

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

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

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

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

Дэвид

+2

Вы должны использовать реальный XML-парсер (например, DOM или такой), а не хаки – KingCrunch

+0

Существует множество вопросов по SO о разборе XML-файлов с PHP и захвате данных в нем. http://stackoverflow.com/search?q=%5Bphp%5D+xml+parsing –

+0

Спасибо, ребята. Это однократное преобразование из документа MSWord (350 страниц), которое я хочу получить в виде файла xml или mysql. –

ответ

-1

Использование 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>" 
    } 
} 

Редактировать:/это модификатор добавлен к REGEX

+0

Спасибо, Иван ... Я понял .. Я не могу опубликовать сценарий здесь как Я ноб, но это по строкам вашего кода. –

+1

Вы не получите этот результат, так как '*' жадный. – Gumbo

1

Добавление к предыдущему ответу, я бы включать «S» в нижнем регистре после ввода в чтобы заботиться о разрывах строк.

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

например.

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

+0

Извините, я пропустил это:. представляет любой символ, кроме символов новой строки./s подавляет это поведение и. ловушки новые строки –

+0

Приятный с регулярным выражением, хотя –

+0

У меня есть чему поучиться, спасибо всем за то, что вы его используете. Теперь у меня есть очень грубый, но совместимый XML-файл, мне нужно выяснить, как назначить подтеги для конкретных элементов. Элементы находятся в греческом, поэтому это непросто. –

1

Вы должны действительно использовать 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()); 
} 

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

$doc->registerXPathNamespace('w', 'http://example.com/'); 
Смежные вопросы