【问题标题】:PHP DOM append child with new linePHP DOM 用新行附加子级
【发布时间】:2010-07-01 04:07:12
【问题描述】:

我叫瑞西。

在 xml 中添加新节点或元素之前,我不知道如何添加新行。

我的 php:

$dom = new DOMDocument();

$dom->formatOutput = true;

$dom->preserveWhiteSpace = true;

$dom->load($xml_file);

$body = $dom->getElementsByTagName('body')->item(0);

$newelement_seg = $dom->createElement('seg');

$data = $dom->createTextNode(" text 2 ");  

$newelement_seg->appendChild($data);

$body->appendChild($newelement_seg);

$dom->save($xml_file);

XML 在添加新子项之前:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <seg>
        text 1
    </seg>
</body>
</xml>

追加新子项后的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <seg>
        text 1
    </seg>
    <seg>
        text 2
    </seg>
</body>
</xml>

但我想要:

<?xml version="1.0" encoding="UTF-8"?>
    <body>
        <seg>
            text 1
        </seg>
        <seg>
            text 2
        </seg>
    </body>
</xml>
<hr/>

提前致谢!

【问题讨论】:

  • 如果格式正确,您的问题会更清晰。老实说,点击“代码”按钮比用 HTML 实体替换所有尖括号和双倍行距要容易得多。

标签: php dom


【解决方案1】:

总结给出的答案:

  1. 您必须将 formatOutput 设置为 true

  2. 您必须将 ignoreWhiteSpace 设置为 false

即:

$dom = new DomDocument();
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->load($myxmlfile);

【讨论】:

    【解决方案2】:

    完美的解决方案。它正在工作。这是我使用的代码:

           //create new document object
            $dom_object = new DOMDocument(); 
    
            //load xml file
            $xml_file_path = get_template_directory()."/flash/playlist.xml";
            $dom_object->formatOutput = true;    
            $dom_object->preserveWhiteSpace = false;
            $dom_object->load($xml_file_path);    
    

    【讨论】:

      【解决方案3】:

      你想完成什么?

      通过将preserveWhiteSpace 设置为true(不必要;这是默认设置),您是在告诉libxml 不要忽略仅由空格组成的文本节点。然而,与此同时,您正在尝试漂亮地格式化 XML 文件,这需要空白节点。

      然后,即使忽略空白,您也必须意识到&lt;seg&gt; 标签内的空白很重要; libxml 不会删除那些;如果在text 1之后强制换行,下一行的&lt;/seg&gt;结束标签一定不能缩进,否则标签内文本节点的内容会有所不同。

      你的代码给了我这个:

      <?xml version="1.0" encoding="UTF-8"?>
      <body>
      <seg>
        text 1  
      </seg>
      <seg> text 2 </seg></body>
      

      由于您告诉 libxml 空格很重要,因此它不能在第二个 &lt;/seg&gt; 之后放置换行符,否则它将创建另一个文本节点。

      如果你说$dom-&gt;preserveWhiteSpace = false;

      <?xml version="1.0" encoding="UTF-8"?>
      <body>
        <seg>
        text 1  
      </seg>
        <seg> text 2 </seg>
      </body>
      

      标签是缩进的,但 libxml 仍然不能这样做:

      <?xml version="1.0" encoding="UTF-8"?>
      <body>
        <seg>
          text 1  
        </seg>
        <seg>
          text 2
        </seg>
      </body>
      

      因为它会改变 &lt;seg&gt; 内的文本节点的内容。

      您可能想尝试tidy,但我不确定它是否能满足您的需求。

      【讨论】:

      • 好的,问题已解决!十分感谢!对于seg标签中的文字,我可以做到。
      猜你喜欢
      • 2020-11-10
      • 2011-10-15
      • 1970-01-01
      • 2018-08-19
      • 2012-11-25
      • 2017-01-29
      • 2015-07-27
      • 2020-11-08
      • 2019-05-24
      相关资源
      最近更新 更多