- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现 importNode 之后的 xml 会有一个“默认”前缀。经过一些实验,我发现了一些奇怪的现象。
如何解释以下结果:
代码在这里:
<?php
$dom = new DOMDocument();
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<A xmlns="xmlns://www.abc.com"><B/></A>
XML;
$dom->loadXML($xml);
$new_dom = new DOMDocument();
$new_root = $new_dom->createElement("root");
$new_node = $new_dom->importNode($dom->documentElement->childNodes->item(0), TRUE);
//order is important
$new_dom->appendChild($new_root); //1
$new_root->appendChild($new_node); //2
$new_node->removeAttributeNS("xmlns://www.abc.com", ""); //3
//
echo $new_dom->saveXML()
?>
123
<?xml version="1.0"?>
<root><B/></root>
132,231,321,312
<?xml version="1.0"?>
<root><default:B/></root>
213
<?xml version="1.0"?>
<root xmlns:default="xmlns://www.abc.com"><default:B/></root>
最佳答案
您正在删除使用的命名空间的命名空间定义。根据调用的顺序,会触发不同的修复/回退。删除/更改命名空间的预期方法是遍历并重新创建节点。
libxml 对命名空间定义做了一些优化和回退。如果您做了“奇怪”的事情,它可能会替换命名空间别名,并且可能会破坏结果。触发器是具有命名空间的属性。但没有前缀。与元素不同,命名空间内的属性必须有前缀。这是触发默认命名空间前缀的示例:
$document = new DOMDocument();
$document->appendChild($document->createElementNS('urn:1', 'foo'));
// add attribute in namespace without prefix
$document->documentElement->setAttributeNS('urn:1', 'bar', 21);
echo $document->saveXML();
<?xml version="1.0"?>
<foo xmlns="urn:1" xmlns:default="urn:1" default:bar="21"/>
$document = new DOMDocument();
$document->appendChild($document->createElementNS('urn:1', 'foo'));
// add attribute in element namespace with prefix
$document->documentElement->setAttributeNS('urn:1', 'b:bar', 21);
echo $document->saveXML();
$document = new DOMDocument();
$document->appendChild($document->createElementNS('urn:1', 'b:foo'));
$document->documentElement->setAttributeNS('urn:1', 'b:bar', 21);
echo $document->saveXML();
<?xml version="1.0"?>
<b:foo xmlns:b="urn:1" b:bar="21"/>
$new_node->removeAttributeNS("xmlns://www.abc.com", "");
告诉 DOM 删除命名空间内的一个属性
xmlns://www.abc.com
没有名字。然而
xmlns=""
不是属性,而是命名空间定义。它使用相同的语法,并且在某些情况下可以使用属性方法进行修改,但 libxml 可能会再次添加它,因为后代或属性节点位于命名空间内并且需要定义。
xmlns="..."
不在任何 namespace 和 namespace 定义中,前缀类似于
xmlns:foo="..."
在保留的命名空间内
http://www.w3.org/2000/xmlns/
. imho 删除命名空间定义的正确调用是:
// xmlns="..."
$node->removeAttributeNS(NULL, 'xmlns');
// xmlns:prefix="..." - broken in PHP or libxml?
$node->removeAttributeNS('http://www.w3.org/2000/xmlns/', 'prefix');
$document = new DOMDocument();
$document->appendChild($document->createElementNS('urn:1', 'b:foo'));
$document->documentElement->setAttributeNS(NULL, 'xmlns', 'urn:2');
$document->documentElement->setAttributeNS(
'http://www.w3.org/2000/xmlns/', 'xmlns:bar', 'urn:3'
);
echo $document->saveXML();
$document->documentElement->removeAttributeNS(NULL, 'xmlns');
echo $document->saveXML();
// for some reason that does not work
$document->documentElement->removeAttributeNS(
'http://www.w3.org/2000/xmlns/', 'bar'
);
echo $document->saveXML();
// but this works - weird
$document->documentElement->removeAttributeNS('urn:3', 'bar');
echo $document->saveXML();
<?xml version="1.0"?>
<b:foo xmlns:b="urn:1" xmlns:bar="urn:3" xmlns="urn:2"/>
<?xml version="1.0"?>
<b:foo xmlns:b="urn:1" xmlns:bar="urn:3"/>
<?xml version="1.0"?>
<b:foo xmlns:b="urn:1" xmlns:bar="urn:3"/>
<?xml version="1.0"?>
<b:foo xmlns:b="urn:1"/>
关于php - 在 PHP 中使用 importNode、namespace 和 appendChild 的奇怪事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293167/
我在 html 文档中编写了一个函数,它应该从另一个 html 文档中获取一个节点。 我阅读了有关 importNode() 的内容,但我不明白应该如何指向要从中导入的文档。我在任何地方都找不到任何网
我在一些代码示例中注意到克隆 DOM 节点并将其附加到现有元素的看似不同的方法: element.appendChild(something.cloneNode(true)); element.app
我想使用 HTML 导入,因此我创建了两个文件。 文件1: div { height: 300px; width: 30
我目前正在开展一个项目,我必须在该项目中创建 XMLNode 并将它们插入 XML 文件中的特定位置。 XMLNode 是一个包含大约 90 个单元格的行。 ABC 100 ABC -
我的 XML 看起来像 this. 我想将 collected_objects“导出”到另一个文档中。这是我的代码- NodeList nList = reader.getElementsByTa
我有一个动态页面,通过一个栏按钮,我可以更改主要 div 内容。大多数页面都是静态的,除了一个包含 JavaScript(RGraph 图表)的页面。这就是为什么为了使其正常工作,我使用以下代码: v
我有一个模板,我正在通过 document.importNode 进行迭代克隆。我不能做的是向克隆的元素添加一个类。 var t = document.querySelector('#template
我一直在网上四处寻找,我很确定我已经知道答案(“否”),但我想检查一下: IE 支持 importNode() 了吗?有没有比遍历 DOM 和创建节点更好的选择? (我见过 the clasic ar
重新升级此代码: var tmpNewNode = xdoc.ImportNode(newNode, true); if (oldNode.ParentNode != null)
我正在阅读“Web Components mit Polymer”一书,并尝试了书中的以下代码: var tplContent = document.getEl
我想复制一个节点到不同的Documentg,但是它总是有DOMException about org.apache.harmony.xml.dom.NodeImpl.setNameNS(NodeImp
我正在使用 XmlDocument 迁移一些代码使用XDocument .作为此代码的一部分,我需要将一个文档中的元素添加到另一个文档中。有了 XmlDocument,我可以使用 ImportNode
我正在编写必须添加节点到 XML 文档中给定节点的函数。 这是该函数的实现: /** * Adds the node aNewChild to the end of the list of chil
我正在尝试使用以下示例理解 html 中的 importNode。 假设我们有一个content.html: Hi there! 和一个main.ht
Document.importNode in specification Node.cloneNode in specification 这两种方法同样有效。请给我一个真实的例子,我可以在其中看到这些
请注意,SOAPHeader 扩展了 Node 和 Element 接口(interface): Document docToAppend= getDoc(); final SOAPHeader
我正在尝试使用标准 Oracle JDK 7 和 Saxon HE 合并两个 XML 文档,但我不断收到: org.w3c.dom.DOMException: NOT_SUPPORTED_ERR: T
我发现 importNode 之后的 xml 会有一个“默认”前缀。经过一些实验,我发现了一些奇怪的现象。 如何解释以下结果: 代码在这里:
我想使用 html 模板。使用 Chrome 一切正常,但在 Firefox 中,模板元素没有任何内容......也许它只是没有显示在调试器中,但是当我尝试实例化模板的内容时,我也没有得到任何内容.
为什么以下在 IE11 中抛出 "Object doesn't support property or method 'importNode'"? 莫非是我的“文档模式”?我处于“文档模式”7.
我是一名优秀的程序员,十分优秀!