0

这是我的xml文件内容:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
    <w:body>
        <w:p w:rsidR="00551371" w:rsidRDefault="0010551B" w:rsidP="0010551B">
            <w:pPr>
                <w:jc w:val="center"/>
            </w:pPr>
            <w:r>
                <w:t xml:space="preserve">Hi this is a paragraph with </w:t>
            </w:r>
            <w:r w:rsidRPr="00517389">
                <w:rPr>
                    <w:b/>
                </w:rPr>
                <w:t>default</w:t>
            </w:r>
            <w:r>
                <w:t xml:space="preserve"> text and some wording in it so </w:t>
            </w:r>
        </w:p>
        <w:p w:rsidR="0010551B" w:rsidRDefault="0010551B" w:rsidP="0010551B">
            <w:pPr>
                <w:jc w:val="center"/>
            </w:pPr>
            <w:r>
                <w:t xml:space="preserve">Here is new </w:t>
            </w:r>
            <w:r w:rsidRPr="00517389">
                <w:rPr>
                    <w:u w:val="single"/>
                </w:rPr>
                <w:t>line sentence</w:t>
            </w:r>
            <w:r>
                <w:t xml:space="preserve"> with some text.</w:t>
            </w:r>
        </w:p>
          .
          .
          .
          and so on.

现在我正在<w:t>独立获取内容,下面是我的代码:

// load the xml into the object
$xml = simplexml_load_file('sample/word/document.xml');

//Use that namespace
$namespaces = $xml->getNameSpaces(true);

$xml->registerXPathNamespace('w', $namespaces['w']);

$nodes = $xml->xpath('/w:document/w:body//w:t');

$i = 1;

foreach ($nodes as $node) {
    echo (string) $node; // prints each node value correctly
    $node->nodeValue = "abc"; // it adds the node instead of replacing
    $i++;
}

$xml->asXML('test.xml');

w:t分别给了我每个文本的文本,但我想得到 wrt意味着单个节点下<w:p>所有节点中的所有文本都应该被视为单个节点。<w:t><W:p>

像 first 下的文本<w:p>应该返回“嗨,这是一个带有默认文本和一些措辞的段落”。

4

1 回答 1

1

首先,您可以只使用方法来选择命名空间并使用普通的 SimpleXML 访问方法,而不是使用registerXPathNamespace和 XPath 。->children()在这种情况下,您可以使用foreach ( $xml->children('w', true)->body->p as $p_node ) ...

其次,SimpleXML 中没有nodeValue属性(也许您正在考虑 DOM?)。要覆盖元素的内容,您只需分配给它,例如$node->child = 'abc';. 但是,这在循环中有点棘手,因为您必须知道您正在查看哪个元素;但你可以,例如,说$xml->children('w', true)->body->p[0] = 'asd';

最后,要组合<w:p>节点中的所有文本,您需要遍历它们的<w:r>子节点,在您的示例<w:t>中每个子节点都有一个。所以你最终得到一个像这样的嵌套循环:

foreach ( $sx->children('w', true)->body->p as $p_node ) { 
    $p_content=''; 
    foreach ( $p_node->r as $r_node ) { 
        $p_content .= (string)$r_node->t; 
    } 
    echo $p_content;
}
于 2013-02-28T12:43:40.233 回答