0

コードの組み合わせを何回も試しましたが、理解できたと思っても失敗しました!私はいつも「非オブジェクトエラーのプロパティを取得」に戻ります。現在のエラーは次のとおりです。

Notice: Trying to get property of non-object in {PROJECT_DIR} on line 11

とにかく、.docxファイルのdocument.xmlファイルでブックマークのノード値を変更しようとしています。ブックマークIDの=>ブックマーク名の配列があり、単純なforeachを使用してそれらをループしてすべてを編集しています。 SimpleXMLを使用してブックマークを見つけましたが、少し問題があります。

私の現在のコードは次のとおりです。

if (file_exists('document.xml'))
{
    $document = simplexml_load_file('document.xml');
}
echo $document->getName() . "<br />";
echo $document->document->body->{'w:bookmarkStart'};

echoステートメントから->documentを削除し、{'w:bookmarkStart'}をbookmarkStartに変更しようとしましたが、すべてが効果的でないことが証明されましたが、上記の変更を試みても通知は返されず、空白になりました。私はまだこのXMLの要点を理解していないと確信しています。私はそれをかなり気にせず、おそらく皆さんにとって問題を指摘するのは簡単でしょうが、コード例の調査と使用には私にとって効果がないことが証明されました;(私が編集しようとしているXMLファイルのコンパクトバージョンは次のとおりです:

<?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: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:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
            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:w14="http://schemas.microsoft.com/office/word/2010/wordml"
            xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
            xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
            xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
            xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14">
    <w:body>
            <w:bookmarkStart w:id="0" w:name="MOREG"/>
            <w:bookmarkEnd w:id="0"/>
    </w:body>
</w:document>
4

2 に答える 2

0

多分これは助けになりますか? $document->xpath("//w:bookmarkEnd"); xpathクエリを使用する方が実用的であり、ノードを選択することは問題なく機能します。(たぶん、ここの誰かがあなたがそれをしている方法を見つけるのを手伝ってくれるでしょう、これが役に立たないなら申し訳ありません)

于 2012-08-18T19:07:28.747 に答える
0

残念ながら、名前空間(この例では<w:...表記法とxmlns:w="..."宣言法)により、SimpleXMLはそれほど単純ではありません。

最初に知っておくべきことは、w:プレフィックスは実際には「実際の」名前空間のローカルエイリアスであり、これは対応するxmlns:w属性によって定義されたURIです(この場合は、'http://schemas.openxmlformats.org/wordprocessingml/2006/main'

次に知っておくべきことは、デフォルトの(プレフィックスなしの)名前空間以外の要素を取得するには、SimpleXMLメソッド->children($namespace)->attributes($namespace)

少し試行錯誤しながら、次を使用して「MOREG」を出力するXMLの例を取得しました。

$w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
echo $document->children($w)->body->bookmarkStart['name'];

PHP≥5.2を使用している場合はtruechildrenメソッドに渡すことで「w」プレフィックスを実際に使用でき、次のように簡略化できます。

echo $document->children('w', TRUE)->body->bookmarkStart['name'];
于 2012-08-18T19:08:49.540 に答える