Ekran PHP ve XPath ile Kazıma

5 Cevap php

Herkes veri ayıklamak için XPath kullanarak metin biçimlendirme korumak için nasıl biliyor mu?

Ben şu anda tüm blokları açılan am

<div class="info"> <h5>title</h5> text <a href="somelink">anchor</a> </div>

Bir sayfada. Sorun nodeValue eriştiklerinde, ben sadece düz metin alabiliriz. Nasıl h5, yani biçimlendirme ve hala kodu da dahil olmak üzere içeriği yakalayabilir?

Şimdiden teşekkürler. Ben Google ve hayır şans her kombinasyonu hayal aradık.

5 Cevap

Bir DomDocument $ dom parçası olarak bir DomElement $ unsuru olarak varsa, o zaman böyle bir şey yapmak isteyeceksiniz:

$string = $dom->saveXml($element);

Bir elemanın nodeValue gerçekten metinsel değeri değil, yapılandırılmış XML.

Ben Ciaran McNulty cevap eklemek istiyorum

Sen gibi SimpleXML aynı yapabilirsiniz:

$simplexml->node->asXml(); // saveXml() is now an alias

Ve teklif genişletmek için

Bir elemanın nodeValue gerçekten metinsel değeri değil, yapılandırılmış XML.

Aşağıdaki gibi Eğer düğümün düşünebilirsiniz:

<div class="info">
    <__toString()> </__toString()>
    <h5>title</h5>
    <__toString()> text </__toString()>
    <a href="somelink">anchor</a>
    <__toString()> </__toString()>
</div>

Için çağrı $element->nodeValue sadece __ toString () öğelerini alacağı $element->__toString() çağrı gibi durumlarda. Hayali __toString() Ben oluşturulan resmen bir XML_TEXT_NODE olarak tanımlanır.

The XPath language (örneğin DOM API, XSLT, Xquery'nin gibi ...) başka bir dilde gömülü olarak tasarlanmış ve tek başına kullanılamaz. Özgün soru istenen gömme ne olduğunu belirtmiyor.

Below is a very simple and short solution when XPath is embedded in XSLT .

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="div[@class='info']">
       <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

when applied on this xml document:

<html>
    <body>
    	<div class="info">
    		<h1>title1</h1> text1
    		<a href="somelink1">anchor1</a>
    	</div>
    	Something else here
    	<div class="info">
    		<h2>title2</h2> text2
    		<a href="somelink2">anchor2</a>
    	</div>
    	Something else here
    	<div class="info">
    		<h3>title3</h3> text3
    		<a href="somelink3">anchor3</a>
    	</div>
    </body>
</html>

produces the wanted result:

<div class="info">
  <h1>title1</h1> text1
    <a href="somelink1">anchor1</a>
</div>
    	Something else here
<div class="info">
  <h2>title2</h2> text2
  <a href="somelink2">anchor2</a>
</div>
    	Something else here
<div class="info">
  <h3>title3</h3> text3
  <a href="somelink3">anchor3</a>
</div>

Sen XPath sorgusu <div class="info"> de 'biten' emin olmak gerekir. Ancak, XPath çalışır şekilde, yine ayrı düğümlerin 'alt etiketler' bütün alırsınız. Sadece onları birleştirmek gerekir.

Ayrıca ben kullandım değil gibi, ben size çalıştırmak ne olabileceğini sorun diyemeyiz, ama, XPath en join işlevini kullanabilirsiniz.

div/node() hile yapmak gerekir.

Örnek giriş:

<div class="info">
  some <h5>title</h5> text <a href="somelink">anchor</a> more text
</div>

Örnek XSLT stil:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
        <newtag>
                <xsl:copy-of select="div/node()"/>
        </newtag>
</xsl:template>

</xsl:stylesheet>

Örnek çıktı:

<?xml version="1.0" encoding="utf-8"?>
<newtag> some<h5>title</h5> text <a href="somelink">anchor</a> more text</newtag>