2013-08-02 26 views
1

有時,當將XML解析到PHP的DOMDocument中並使用formatOutput=true進行輸出時,將在不需要XML標記的地方引入空白區域。是否有一種標準的方式來表明空白在單個XML元素中很重要?

例如:

<td><i>lorem</i><b>ipsum</b></td> 

變得此,它增加了兩個單詞之間的空格:

<td> 
    <i>lorem</i> 
    <b>ipsum</b> 
</td> 

之一來解決此方法是在手動添加零寬度空間以便解析器將該元素的內容視爲混合內容:

<td><i>lorem</i><b>ipsum</b>&#8203;</td> 

另外還有xml:space="preserve"屬性,這是應該做的解析器把所有的白色空間,顯著,但它似乎並沒有在這種情況下,任何影響:

<?php 

$dom = new DOMDocument; 
$dom->loadXML('<td xml:space="preserve"><i>lorem</i><b>ipsum</b></td>'); 
$dom->formatOutput = true; 
print $dom->saveXML(); 

/* Output: 
<?xml version="1.0"?> 
<td xml:space="preserve"> 
    <i>lorem</i> 
    <b>ipsum</b> 
</td> 
*/ 

有沒有辦法(也許使用DTD)告訴XML解析器/編寫器,某些標記(本例中的<i><b>)代表內聯元素,並且它們之間的空白很重要,或手動將特定元素標記爲包含混合內容?

+0

CDATA也許?? ?? –

+0

添加CDATA只是意味着尖括號得到解釋爲文本,並且在輸出獲得轉義:'​​<我> LOREM </I > <b> ipsum的</B >' –

回答

0

您可以嘗試聲明該元素具有混合內容(元素和#PCDATA)。您必須在td級別執行此操作,而不是ib級別。

例子:

<!DOCTYPE td [ 
<!ELEMENT td (#PCDATA|i|b)*> 
<!ELEMENT i (#PCDATA)> 
<!ELEMENT b (#PCDATA)> 
]> 
<td><i>lorem</i><b>ipsum</b></td> 

我沒有PHP嘗試。

+0

使用相同的碼作爲上述但與在這個答案中添加了DTD,加上loadXML的LIBXML_DTDLOAD選項,它仍然像以前那樣產生了帶有增加的空白的輸出。混合內容*可以存在的聲明看起來並不會使該元素被視爲混合內容*在那裏。 –

0

如果你想讓空白有意義,爲什麼你要用formatOutput=true?!不要再打在鼻子裏,鼻子最終可能會止血。

+0

我希望輸出是相當印刷的,並有適當的縮進(源XML縮進很少)。在文檔級別,空白不重要,但在某些元素中(如果可能)是空白區域。 –

相關問題