2011-01-03 12 views
0

Ich kann keine bestimmte Frage wie diese finden, also poste ich. Hoffentlich wird dies von allgemeinem Nutzen sein.Wie erhalten Sie die gesamten XML-Elemente eines bestimmten Namespace mit ihren Tags?

Ich habe eine Datei, die XML-Tags von "<w:t> data data.....</w:t>" enthält. Es gibt auch viele andere Sachen. Ich muss alles innerhalb (einschließlich) der <w:t></w:t> Tags erfassen.

Ich würde gerne Vorschläge für das weitere Vorgehen hören.

Vielen Dank im Voraus ..

David

+2

Sie verwenden sollten, ein echter XML-Parser (wie DOM oder so) anstelle von Hacks – KingCrunch

+0

Es gibt einige Fragen zu SO über das Parsen von XML-Dateien mit PHP und das Erfassen der darin enthaltenen Daten. http://stackoverflow.com/search?q=%5Bphp%5D+xml+parsing –

+0

Danke Jungs. Dies ist eine einmalige Konvertierung von einem (350page) MSWord Dokument, das ich als xml oder mysql Datei beenden möchte. –

Antwort

-1

Verwenden domxml bevorzugt Option, da sie Sie für andere Tags/Daten auf die Suche nicht einschränken.

Aber die Verwendung von regulären Ausdrücken macht viel weniger Code, also würde ich für preg_match_all gehen, wenn diese Tags nur das sind, was Sie brauchen.

$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); 

Antwort:

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

Edit:/ist Modifikator

+0

Danke Ivan ... Ich habe es .. Ich kann das Skript hier nicht als schreiben Ich bin ein Noob, aber es ist in der Linie Ihres Codes .. –

+1

Sie werden dieses Ergebnis nicht bekommen, da das '*' gierig ist. – Gumbo

1

zu Hinzufügen der vorherigen Antwort auf regex hinzugefügt, ich würde ein 's' in Kleinbuchstaben nach dem i sind in der Ende um Zeilenumbrüche zu kümmern.

Guter Punkt von Herrn Gumbo unten. Ja, fügen Sie auch ein 'U' in Großbuchstaben nach dem 's' hinzu, um den Ausdruck weniger gierig zu machen, sonst wird es nicht wie erwartet funktionieren.

z.B.

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

+0

Entschuldigung, das habe ich verpasst:. steht für ein beliebiges Zeichen außer neuen Zeilenzeichen./s Modifikator unterdrückt dieses Verhalten und. Traps neue Zeilen –

+0

Nice One mit der Regex obwohl –

+0

Ich habe eine Menge zu lernen, danke Ihnen allen für Chipping in. Jetzt habe ich meine - sehr grobe - aber konforme XML-Datei, muss ich herausfinden, wie Unter-Tags zuweisen bestimmte Elemente. Die Elemente sind auf Griechisch, so ist es nicht einfach .. –

1

Sie wirklich einen XML-DOM-Parser wie SimpleXML verwenden sollten:

$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()); 
} 

Wenn Sie w in Ihrem XML-Dokument den Namespace nicht angeben, verwenden SimpleXMLElement::registerXPathNamespace:

$doc->registerXPathNamespace('w', 'http://example.com/');