簡體   English   中英

使用insertbefore時xml縮進

[英]php - xml indentation when using insertbefore

這是我的xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node/>
  <node>
    <child id="child1">
      <subchild1/>
      <subchild2/>
    </child>
    <child id="child2">
      <subchild1/>
      <subchild2/>
    </child>
    <child id="child3">
      <subchild1/>
      <subchild2/>
    </child>
  </node>
</root>

當我使用insertbefore插入節點時,它可以工作,但是該節點的代碼沒有縮進:

$next = $xpath->query('/root/node/child[@id="child1"]/subchild2');
       // Create the new element
      $element = $dom->createElement('subchildmiddle'); 
      $parent = $xpath->query('/root/node/child[@id="child1"]');
       $parent->item(0)->insertBefore($element, $next->item(0)); 

結果是這樣的:

<child id="child1">
      <subchild1/>
      <subchildmiddle><subchild2/>
    </child>

但我會:

<child id="child1">
          <subchild1/>
          <subchildmiddle>
          <subchild2/>
        </child>

這可能嗎? 我用了

$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

(我已經在前面的問題中找到了它)來格式化代碼並且它可以工作,但對子子對象無效!

preserveWhiteSpace有您加載XML文檔之前被禁用。 該選項配置解析器,使其忽略空白文本節點。

格式化並不總是可以完美地進行,它會在節點之間添加空格節點。 但是空格節點可以具有含義(例如<strong class="firstLetter">H</strong>ello )。 序列化程序將嘗試避免添加會更改內容的空白節點,從而避免格式化。

另外,您的源可以被優化:

$document = new DOMDocument();
$document->preserveWhiteSpace = FALSE;
$document->formatOutput = TRUE;
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('/root/node/child[@id="child1"][1]') as $parent) {
  $parent->insertBefore(
    $document->createElement('subchildmiddle'),
    $xpath->evaluate('subchild2', $parent)->item(0)
  );
}

echo $document->saveXml();

輸出

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node/>
  <node>
    <child id="child1">
      <subchild1/>
      <subchildmiddle/>
      <subchild2/>
    </child>
    <child id="child2">
      <subchild1/>
      <subchild2/>
    </child>
    <child id="child3">
      <subchild1/>
      <subchild2/>
    </child>
  </node>
</root>

這樣,第一個表達式將獲取父節點。 第二個表達式使用父節點作為上下文,如果它返回一個空節點列表,則該節點將被添加為最后一個子節點。 這樣可以避免在->item(0)上調用方法,如果表達式返回空列表,該方法將觸發錯誤。

暫無
暫無

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

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