我试图用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。但哪一个可以帮我实现这个目标呢?
答案 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());