簡體   English   中英

如何通過標簽中的ID從XML獲取CDATA文本

[英]How to get CDATA texts from XML by id in tags

我知道如何使用PHP訪問XML中的標簽,但是這一次,我必須使用函數getText($textId)來訪問那些標簽中的文本內容,但是我嘗試了很多事情,我迫切需要幫助。

我試過了

$doc->load("localisations_EN.xml");
$texts = $doc->getElementsByTagName("txt");
$elem = $doc->getElementById("home");
$children = $elem->childNodes;

 foreach ($children as $child) {

     if ($child->nodeType == XML_CDATA_SECTION_NODE) {
           echo $child->textContent . "<br/>";
        }
} 


 print_r($texts);
 print_r($doc->getElementById('home'));


 foreach ($texts as $text) 
 {
     foreach($text->childNodes as $child) {
         if ($child->nodeType == XML_CDATA_SECTION_NODE) {
             echo $child->textContent . "<br/>";
         }

     }
 }

然后我嘗試了這個,但是我不知道如何訪問字符串值

$xml=simplexml_load_file("localisations_EN.xml") or die("Error: Cannot create object");
print_r($xml);
$description = $xml->xpath("//txt[@id='home']");
var_dump($description);

我有這樣的東西

array(1){[0] => object(SimpleXMLElement)#2(1){[“” @attributes“] => array(1){[” id“] => string(4)” home“}}}

這是我必須使用的XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<localisation application="test1">
    <part ID="menu">
        <txt id="home"><![CDATA[Home]]></txt>
        <txt id="news"><![CDATA[News]]></txt>
        <txt id="settings"><![CDATA[Settings]]></txt>
    </part>
    <part ID="login">
        <txt id="id"><![CDATA[Login]]></txt>
        <txt id="password"><![CDATA[Password]]></txt>
        <txt id="forgetPassword"><![CDATA[Forget password?]]></txt>
    </part>
</localisation>

謝謝你的幫助。

simplexml元素具有__toString()魔術函數,該函數將返回元素的文本內容(但是,不是子元素的文本內容),因此您的simplexml代碼應為

$xml=simplexml_load_file("localisations_EN.xml");
$description = (string) $xml->xpath("//txt[@id='home']")[0];
            //   ^-- triggers __toString()               ^-- xpath returns array

因為xpath返回一個元素數組,所以您需要獲取一個(或多個)並將其轉換為字符串。 獲取該元素的立即內容。

使用DOMDocument:

不知道為什么要去那里的(不存在的)子節點。 CDATA只是說“不要解析,這就是數據”的語法

$doc = new DOMDocument;
$doc->load("localisations_EN.xml");
$texts = $doc->getElementsByTagName('txt');
foreach($texts as $text) {
    if($text->getAttribute('id') == 'home') { 
         // prepend hasAttribute('id') if needed to if clause above
         $description = $text->textContent;
    }
}

同樣,如果DTD將某些屬性設置為ID,則$doc->getElementById()可能僅適用。 由於您的xml不能執行此操作(它沒有命名DTD),因此無法正常工作。

與DOMDocument和DOMXPath

// $doc as before
$xpath = new DOMXPath($doc);
$description = $xpath->evaluate('//txt[@id="home"]')[0]->textContent;
// as before, xpath returns an array, that's why  ---^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM