从xml中使用xpath获取值

3

我有一个将Word文档转换成XML文件的部分如下:

<w:tc>
    <w:tcPr>
        <w:tcW w:w="2130" w:type="dxa"/>
    </w:tcPr>
    <w:p w:rsidR="00255D05" w:rsidRPr="00FF409F" w:rsidRDefault="00255D05" w:rsidP="00D041E7">
        <w:pPr>
            <w:rPr>
                <w:rFonts w:hint="cs"/>
                <w:sz w:val="36"/>
                <w:szCs w:val="36"/>
                <w:rtl/>
                <w:lang w:bidi="ar-JO"/>
            </w:rPr>
        </w:pPr>
        <w:r w:rsidRPr="00FF409F">
            <w:rPr>
                <w:rFonts w:hint="cs"/>
                <w:sz w:val="36"/>
                <w:szCs w:val="36"/>
                <w:rtl/>
                <w:lang w:bidi="ar-JO"/>
            </w:rPr>
            <w:t>myWantedText</w:t>
        </w:r>
    </w:p>
</w:tc>

我正在尝试获取'myWantedText'的值,目前尝试过的方法有:

$xml = new SimpleXMLElement($fileContents);
foreach($xml->xpath('//w:t') as $t) {
    var_dump($t);
}

但是我得到的只是一堆object(SimpleXMLElement)[2]

2个回答

2
您缺少一个输入XML中的命名空间和一个声明,正如Stuart指出的那样。以下是您的XML,带有正确的Word XML命名空间
<?php

$str = <<<XML
<?xml version="1.0" standalone="yes"?>
<w:tc xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
    <w:tcPr>
        <w:tcW w:w="2130" w:type="dxa"/>
    </w:tcPr>
    <w:p w:rsidR="00255D05" w:rsidRPr="00FF409F" w:rsidRDefault="00255D05" w:rsidP="00D041E7">
        <w:pPr>
            <w:rPr>
                <w:rFonts w:hint="cs"/>
                <w:sz w:val="36"/>
                <w:szCs w:val="36"/>
                <w:rtl/>
                <w:lang w:bidi="ar-JO"/>
            </w:rPr>
        </w:pPr>
        <w:r w:rsidRPr="00FF409F">
            <w:rPr>
                <w:rFonts w:hint="cs"/>
                <w:sz w:val="36"/>
                <w:szCs w:val="36"/>
                <w:rtl/>
                <w:lang w:bidi="ar-JO"/>
            </w:rPr>
            <w:t>myWantedText</w:t>
        </w:r>
    </w:p>
</w:tc>
XML;

$xml = new SimpleXMLElement($str);
$xml->registerXPathNamespace('w', 'http://schemas.microsoft.com/office/word/2003/wordml');
foreach($xml->xpath('//w:t') as $t) {
    var_dump($t);
}
?>

输出:

object(SimpleXMLElement)#2 (1) {
  [0]=>
  string(12) "myWantedText"
}

您可以在这里看到它的运行情况:http://codepad.org/YRIO6uk3

我已完全复制并粘贴了您的代码,但是我得到的只是 object(SimpleXMLElement)[2] - alli awwad
1
@alliawwad 将 var_dump($t); 改为 echo $t;。这是一个好答案! - Nir Alfasi

0
问题在于字符“:”会破坏对xpath的调用。
解决方法是可以这样做:
<?php

$str = <<<XML
<?xml version="1.0" standalone="yes"?>
<w:tc>
    <w:tcPr>
        <w:tcW w:w="2130" w:type="dxa"/>
    </w:tcPr>
    <w:p w:rsidR="00255D05" w:rsidRPr="00FF409F" w:rsidRDefault="00255D05" w:rsidP="00D041E7">
        <w:pPr>
            <w:rPr>
                <w:rFonts w:hint="cs"/>
                <w:sz w:val="36"/>
                <w:szCs w:val="36"/>
                <w:rtl/>
                <w:lang w:bidi="ar-JO"/>
            </w:rPr>
        </w:pPr>
        <w:r w:rsidRPr="00FF409F">
            <w:rPr>
                <w:rFonts w:hint="cs"/>
                <w:sz w:val="36"/>
                <w:szCs w:val="36"/>
                <w:rtl/>
                <w:lang w:bidi="ar-JO"/>
            </w:rPr>
            <w:t>myWantedText</w:t>
        </w:r>
    </w:p>
</w:tc>
XML;

$xml = new SimpleXMLElement($str);
$result = $xml->xpath('/*');
echo $result[0]->p->r->t;
?>

输出:

myWantedText

更新:
Lego的答案比这个解决方法更好!


我得到了 Trying to get property of non-object 的错误提示,如果我尝试使用 var_dump($result[0]->p->r); ,我会得到 null - alli awwad
你是否使用 /* 解析了 XML? - Nir Alfasi
@alliawwad,我更新了答案,包括完整的代码(包括输出)。你是在做完全相同的事情吗? - Nir Alfasi
“:”在XML中作为命名空间分隔符是完全有效的。除了缺少命名空间声明外,XML没有任何问题。 - user764357

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接