سؤال

لا أحد يعرف كيفية الحفاظ على تنسيق النص عند استخدام XPath لاستخراج البيانات ؟

أنا حاليا استخراج جميع الكتل

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

من صفحة.المشكلة هي عندما كنت الوصول إلى nodeValue, أنا يمكن فقط الحصول على نص عادي.كيف يمكنني التقاط محتويات بما في ذلك التنسيق ، أيh5 و لا يزال في الكود ؟

شكرا مقدما.لقد بحثت في كل مجموعة يمكن تخيلها على جوجل و لا حظ.

هل كانت مفيدة؟

المحلول

إذا كان لديك على أنها عنصر DomElement $ كجزء من DomDocument $ دوم ثم هل تريد أن تفعل شيئا مثل:

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

ووNodeValue عنصر هو حقا قيمة نصية، وليس XML منظم.

نصائح أخرى

وأود أن أضيف إلى سياران ماكنولتي الجواب

ويمكن أن تفعل الشيء نفسه في SimpleXml مثل:

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

والتوسع في الاقتباس

<اقتباس فقرة>   

ووNodeValue عنصر هو حقا قيمة نصية، وليس XML منظم.

ويمكنك التفكير في العقدة على النحو التالي:

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

وأين الدعوة إلى $element->nodeValue مثل الدعوة $element->__toString() التي من شأنها فقط الحصول على __toString عناصر (). يتم تعريف __toString() همي أنا خلقت رسميا باعتباره XML_TEXT_NODE .

على XPath اللغة مصممة لتكون جزءا لا يتجزأ في لغة أخرى (مثل دوم API, XSLT ، XQuery, ...) و لا يمكن استخدامها مستقل.السؤال الأصلي لا يحدد ما هو المطلوب تضمينها.

أدناه هو بسيط جدا وقصيرة الحل عند XPath هي جزء لا يتجزأ في XSLT.

هذا التحول:

<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>

عند تطبيقها على مستند xml:

<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>

تنتج النتيجة المطلوبين:

<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>

وأنت بحاجة للتأكد من لديك استعلام XPath "ينتهي" في <div class="info">. ومع ذلك، بسبب الطريقة التي تعمل كسباث، فسوف لا تزال تحصل على كل من 'العلامات الفرعية "في العقد منفصلة. ستحتاج فقط لسلسلة لهم.

ويمكنك أيضا استخدام الانضمام وظيفة، على الرغم، كما أنني لم استخدامه، لا أستطيع أن أقول ما المشاكل التي قد يرشح نفسه في ل.

وdiv/node() يجب أن تفعل خدعة.

مثال المدخلات:

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

مثال XSLT الأنماط:

<?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>

والناتج مثال:

<?xml version="1.0" encoding="utf-8"?>
<newtag> some<h5>title</h5> text <a href="somelink">anchor</a> more text</newtag>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top