Neden bu XPath sorgusu başarısız oluyor?

0 Cevap php

Hareketli parçaların sürü gibi bu soru, biraz karmaşık, ama ben sadece en alakalı parçalarını küçültmek ve kullanmaya çalışacağım.

Ben PHP DOM sınıfları dayalı bir XML / XHTML belge çözümleyici üzerinde çalışıyorum, ama görünen o ki DOMXPath başarısız kullanır parçası. Bu örnek belge Verilen:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http://localhost/~/zuqml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    <h1 id="pageHeading">
        <zuq:data name="pageHeading" />
    </h1>
    <p id="pageDescription">
        <zuq:data name="pageDescription">
            <zuq:format type="trim">
                <zuq:param name="length">300</zuq:param>
                <zuq:param name="append">...</zuq:param>
            </zuq:format>
        </zuq:data>
    </p>
    <div id="toolbar">
        <zuq:region name="toolbar" />
    </div>
    <div id="postWrap">
        <zuq:region name="post">
            <div class="post">
                <img height="200" width="200">
                    <zuq:attr name="src">
                        ./src/<zuq:data name="postImageSrc" />
                    </zuq:attr>
                </img>
                <h2><zuq:data name="postHeading" /></h2>
                <p>
                    <zuq:data name="postBody">
                        <zuq:format type="trim">
                            <zuq:param name="length">300</zuq:param>
                            <zuq:param name="append">
                                <a>
                                    <zuq:attr name="href">
                                        ./?postId=<zuq:data name="postId" />
                                    </zuq:attr>
                                    More »
                                </a>
                            </zuq:param>
                        </zuq:format>
                    </zuq:data>
                </p>
            </div>
        </zuq:region>
    </div>
</body>
</html>

Ben (aslında başka DataObject nesnelerin sadece bir fantezi ağacı) bir DataObject nesneyi alır ve ağaçtaki verileri kullanarak ayrıştırma belgeler üzerinden döngüler bir ayrıştırıcı yarattık. Belge kaynak yolları da ağaç saklanır.

Ayrıştırıcı yapıcısı:

public function __construct(DataObject $dataObject){
    $this->_dataObject = $dataObject;
}

Bir dize olarak belge dönmek denilen kamu render yöntemi:

public function render($filename = null){
    $document = new DOMDocument;
    $frag = $this->_build($document, $this->_dataObject);
    if(is_null($filename)){
        return $document->saveXML($frag);
    }else{
        //render to file
    }
}

Ve nihayet eylem eti oluyor özel _build yöntemi:

protected function _build(DOMNode $node, DataObject $dataObject){
    $ownerDocument = $node instanceof DOMDocument
        ? $node
        : $node->ownerDocument;

    $buffer = $ownerDocument->createDocumentFragment();    

    for($dataIndex = 0; $dataIndex < $dataObject->count(); $dataIndex++){

        $frag = $ownerDocument->createDocumentFragment();
        if(!$dataObject->hasParent() || ($dataObject->getFilename() != $dataObject->getParent()->getFilename())){
            $frag->appendXML(file_get_contents($dataObject->getFilename()));
        }else{
            foreach($node->childNodes as $child){
                $frag->appendChild($child->cloneNode(true));
            }
        }
        $frag->normalize();

        $xpath = new DOMXPath($ownerDocument);
        $xpath->registerNamespace('zuq', $ownerDocument->lookupNamespaceURI('zuq'));

        //THIS IS WHERE THE TROUBLES ARE
        $nodeList = $xpath->query('.//zuq:data[not(ancestor::zuq:region)]', $frag);

        for($nodeIndex = $nodeList->length - 1; $nodeIndex >= 0; $nodeIndex--){

            //PERFORM REPLACEMENTS

        }
        $buffer->appendChild($frag);
    }
    return $buffer;
}

Ben oldukça bir yığın anlıyorum, ama bir sorun varsa, o yerde orada olmak zorundadır. The problem is that the XPath query is not returning any nodes. Ben düpedüz belgeler üzerinde test ettik ve iyi çalışıyor. Bunun dışında verilen düğümün kapsamında herhangi bir <zuq:region /> elemanları, tüm <zuq:data /> elemanları bulur (özyineleme bölgeler olabilir ki, ama henüz orada değilim) hangi olacak Tek tek her bölge seviyede ayrıştırma izin.

I üzerinden $nodeList = $xpath->query('.//*', $frag); ve halka kullandığınızda edilen $nodeList, bu <html> ile en iç içe için, belgenin tüm öğeleri vardır.

Neden $nodeList = $xpath->query('.//zuq:data[not(ancestor::zuq:region)]', $frag); sorgusu başarısız edilir? Ben gerçekten, basit bir mesele olduğunu umuyoruz "Oh, sadece _ _ unuttum."

Önceden, gerçekten herhangi bir yardım takdir, ve daha detay gerekli ise, ben sadece bana bildirin, sağlamak için mutlu olurdu.

0 Cevap