PHP使用命名空间附加XML文档

时间:2015-05-09 14:11:44

标签: php xml xpath

我试图用PHP解析docx文件。现在我想追加document.xml文件(这是解压缩的docx文件的主要部分)。结构是:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"                               xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"             
mc:Ignorable="w14 wp14">
        <w:body>
            <w:p w:rsidR="00080C51" w:rsidRDefault="00080C51">
                <w:pPr>
                    <w:pStyle w:val="a3"/>
                    <w:ind w:left="1020"/>
                    <w:rPr>
                        <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                        <w:sz w:val="22"/>
                        <w:szCs w:val="22"/>
                    </w:rPr>
                </w:pPr>
                <w:bookmarkStart w:id="0" w:name="_GoBack"/>
                <w:bookmarkEnd w:id="0"/>
            </w:p>
            <w:sectPr w:rsidR="00080C51">
                <w:pgSz w:w="11906" w:h="16838"/>
                <w:pgMar w:top="850" w:right="850" w:bottom="850" w:left="1417" w:header="708" w:footer="708" w:gutter="0"/>
                <w:cols w:space="708"/>
                <w:docGrid w:linePitch="360"/>
            </w:sectPr>
        </w:body>
    </w:document>

我想要做的是将新的子<w:p>some text</w:p>标记添加到<w:body>标记。我怎么能这样做?

在PHP中使用XML文档有许多方法,比如DOM,SimpleXMLElement。但哪一个可以帮我实现这个目标呢?

1 个答案:

答案 0 :(得分:1)

您可以使用SimpleXML执行以下操作:

$data = simplexml_load_file('test.xml');

$ns = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'; // the namespace

foreach ($data->children($ns) as $i) {
    // add 'p' element only if the current child name is 'body'
    if ($i->getName() == 'body') {
        $newVal = $i->addChild('p', 'testval'); // add the child
        // only if you want it to have the same attributes as the 'p' element above;
        // otherwise comment out the two lines below
        $newVal->addAttribute('w:rsidR', '00080C51', $ns);
        $newVal->addAttribute('w:rsidRDefault', '00080C51', $ns);
    }
}

print_r($data->asXML());

修改

这是一个使用DOM的版本,它将新元素添加为w:body中的第一个元素:

$xmlDoc = new DOMDocument();
$xmlDoc->load("test.xml");

$ns = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';

$newVal = new DOMElement('p', 'testval', $ns);

foreach ($xmlDoc->childNodes as $i) {
        foreach ($i->childNodes as $j) {
                if($j->localName == 'body') {
                        $j->insertBefore($newVal, $j->firstChild);
                }
        }
}

// add the attributes after the new DOMElement is added
$newVal->setAttributeNS($ns, 'rsidR', '00080C51');
$newVal->setAttributeNS($ns, 'rsidRDefault', '00080C51');

print_r($xmlDoc->saveXML());