草庐IT

PHP DOM : How to move element into default namespace?

coder 2024-04-06 原文

我尝试了什么,什么不起作用:

  • 输入:

    $d = new DOMDocument();
    $d->formatOutput = true;
    
    // Out of my control:
    $someEl = $d->createElementNS('http://example.com/a', 'a:some');
    
    // Under my control:
    $envelopeEl = $d->createElementNS('http://example.com/default',
                                      'envelope');
    $d->appendChild($envelopeEl);
    $envelopeEl->appendChild($someEl);
    
    echo $d->saveXML();
    
    $someEl->prefix = null;
    echo $d->saveXML();
    
  • 替换后输出无效的 XML:

    <?xml version="1.0"?>
    <envelope xmlns="http://example.com/default">
      <a:some xmlns:a="http://example.com/a"/>
    </envelope>
    <?xml version="1.0"?>
    <envelope xmlns="http://example.com/default">
      <:some xmlns:a="http://example.com/a" xmlns:="http://example.com/a"/>
    </envelope>
    

请注意 <a:some>可能有 child 。一种解决方案是 创建一个新的 <some> , 并复制 <a:some> 中的所有 child 至 <some> .是 这是要走的路吗?

最佳答案

这真是一个有趣的问题。我的第一个意图是克隆 <a:some>节点,删除 xmlns:a属性,删除 <a:some>并插入克隆 - <a> .但这是行不通的,因为 PHP 不允许删除 xmlns:a 属性,就像任何常规属性一样。

在与 PHP 的 DOM 方法苦苦挣扎之后,我开始用谷歌搜索这个问题。我找到了 this在 PHP 文档中对此发表评论。用户建议编写一个函数,在没有命名空间的情况下手动克隆节点:

<?php

/**
 * This function is based on a comment to the PHP documentation.
 * See: http://www.php.net/manual/de/domnode.clonenode.php#90559
 */
function cloneNode($node, $doc){
  $unprefixedName = preg_replace('/.*:/', '', $node->nodeName);
  $nd = $doc->createElement($unprefixedName);

  foreach ($node->attributes as $value)
    $nd->setAttribute($value->nodeName, $value->value);

  if (!$node->childNodes)
    return $nd;

  foreach($node->childNodes as $child) {
    if($child->nodeName == "#text")
      $nd->appendChild($doc->createTextNode($child->nodeValue));
    else
      $nd->appendChild(cloneNode($child, $doc));
  }

  return $nd;
}

使用它会导致这样的代码:

$xml = '<?xml version="1.0"?>
<envelope xmlns="http://example.com/default">
  <a:some xmlns:a="http://example.com/a"/>
</envelope>';

$doc = new DOMDocument();
$doc->loadXML($xml);

$elements = $doc->getElementsByTagNameNS('http://example.com/a', 'some');
$original = $elements->item(0);

$clone = cloneNode($original, $doc);
$doc->documentElement->replaceChild($clone, $original);

$doc->formatOutput = TRUE;
echo $doc->saveXML();

关于PHP DOM : How to move element into default namespace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15028966/

有关PHP DOM : How to move element into default namespace?的更多相关文章

  1. javascript - 在 Ace 编辑器中检索字符串的行号 - 2

    我正在尝试检索ace编辑器中显示的文本中给定字符串的行号。示例:搜索“foo”返回:[4,5]条件:ace编辑器内容中第4、5行包含“foo”字符串 最佳答案 遍历所有行并检查indexOffunctionfindFooLineNumbers(editor,foo){varlines=editor.session.doc.getAllLines()varfooLineNumbers=[]for(vari=0,l=lines.length;i 关于javascript-在Ace编辑器中检索

  2. ACE 编辑器中的 Javascript 智能感知 - 2

    长话短说我需要ACE编辑器中JavaScript的智能自动完成/智能感知。解释我正在使用ACE编辑器为JavaScript创建在线IDE。是否有任何库或开源项目允许JavaScript的智能自动完成。JavaScript是一种动态语言,intellisense集成对于此类语言来说是微不足道的(TypeScript确实支持这一点)。ACE编辑器仅支持使用enableBasicAutocompletion的基本自动完成功能(如SublimeText)。我需要智能自动补全,一个实时解析后端javascript并提供建议的引擎。如能提供有关此问题的任何帮助,我们将不胜感激。谢谢。

  3. javascript - Ace Editor 上的按键事件 - 2

    在这个神奇的编辑器(Ace:CodeEditor)上,有一种方法可以获取onchange事件,是否有onkeydown事件?或者我可以模拟它的hack? 最佳答案 没有keydown事件,可以在editor.textInput.getElement()返回的textarea上添加keydown事件监听器,但是更好的方法是使用editor.commands.addCommandeditor.commands.addCommand({name:"...",exec:function(){},bindKey:{mac:"cmd-f",wi

  4. javascript - 修改Ajax.org Cloud9 Editor(Ace Editor)的装订线 - 2

    我的网站上嵌入了一个Ace编辑器,我允许用户在其中输入内容。目前,内置函数自动显示插入的每一行的行号,如下所示:有没有办法让我手动设置gutter中的内容,然后再读取其中的值?例如:与其将其设置为1,2,3...,我希望它看起来像AabcBdef然后当我访问包含“abc”的行时,我想读取该行的装订线中的值“A”。更新:要为AceEditor自定义装订线,您必须覆盖“更新”功能:ace.require("ace/layer/my_gutter")//...define('ace/layer/my_gutter',['require','exports','ace/lib/dom'],fu

  5. javascript - Ace Editor 获取当前光标行和列 - 2

    我正在使用Ace编辑器。在Javascript(不是jQuery)中,我将如何返回当前光标行和列的位置? 最佳答案 editor.getCursorPosition()返回具有行和列属性的对象 关于javascript-AceEditor获取当前光标行和列,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/38181340/

  6. javascript - 如何在 javascript ace 编辑器中标记行号? - 2

    如您在以下屏幕截图中所见:Ace编辑器在左侧有一个“装订线”,其中包含行号。我想检测点击此装订线并为断点插入标记,如以下来自chrome开发工具的屏幕截图我看过Ace编辑器API,但不知道如何操作,有人可以告诉我最好的方法吗?谢谢 最佳答案 查看此线程https://groups.google.com/d/msg/ace-discuss/sfGv4tRWZdY/ca1LuolbLnAJyoucanusethisfunctioneditor.on("guttermousedown",function(e){vartarget=e.do

  7. javascript - Ace Editor 获取当前选中的行号和文本 - 2

    我目前正在使用AceEditor,但我在文档中找不到关于检索当前选定行号及其文本的任何内容。有什么想法吗? 最佳答案 首先,定义“选中的行”。ace中的选择可以跨多行设置。如果你的意思是“没有设置选择,当前行是光标闪烁的行:”varcurrline=editor.getSelectionRange().start.row;varwholelinetxt=editor.session.getLine(currline);如果您需要精确选择的文本,请参阅@parchment的回答,我也差不多写了同样的内容,但现在不需要了。

  8. c# - 如何防止 Ace 在当前目录中寻找主题和模式? - 2

    我一直在开发一个MVC网络应用程序,该应用程序使用Cloud9提供的Ace浏览器内代码编辑器。ace.js脚本和设置ace编辑器的脚本都在我的BundleConfig上的一个ScriptBundle中。bundle正在完美加载。在我的本地服务器上,将web.config中的debug设置为true,脚本运行得非常好。但是,在将web.config中的调试设置为false启动到实时服务器后,出现了几个错误。修复了一些小故障后,仍然存在两个我无法理解其原因的错误。这两个错误看起来非常相似,因为它们都是Ace的chrome主题和Ace的HTML模式脚本的404notfound错误。在设置编辑

  9. javascript - 如何使用 Ace 突出显示多行? - 2

    此处类似问题中提到的旧方法如下:vareditor=ace.edit("editor");varRange=ace.require('ace/range').Range;editor.setReadOnly(true);editor.setTheme("ace/theme/github");editor.getSession().setMode("ace/mode/javascript");editor.getSession().addMarker(newRange(1,0,15,0),"ace_active_line","background");不幸的是,它不起作用,正如您在此处看

  10. javascript - 如何在 ACE 编辑器中设置缩进大小 - 2

    我使用以下代码创建了一个ACE编辑器实例:vareditor=ace.edit("editor");editor.setTheme("ace/theme/monokai");editor.getSession().setMode("ace/mode/javascript");#editor{position:absolute;top:0;right:0;bottom:0;left:0;}functionfoo(x){return2*x;}functionbar(y){returnfoo(y)/2;}console.log(bar(2)+foo(3));我想控制缩进大小(尤其是在按tab

随机推荐