如何在javascript中为默认命名空间中的XML节点分配前缀?
我有一个XML片段,我使用jQuery parseXML解析它。大多数节点没有前缀,它们位于默认名称空间中,有些节点有前缀 我需要将默认名称空间中的所有节点改为与前缀关联。我已经用一个神奇的字符串替换(即如何在javascript中为默认命名空间中的XML节点分配前缀?,javascript,xml,Javascript,Xml,我有一个XML片段,我使用jQuery parseXML解析它。大多数节点没有前缀,它们位于默认名称空间中,有些节点有前缀 我需要将默认名称空间中的所有节点改为与前缀关联。我已经用一个神奇的字符串替换(即xmlns:my=)确保在XML的字符串版本中已经声明了这个前缀http://mydefaulns.com“在加载XML时在根级别声明。) 我尝试了以下方法: var defaultNs="http://mydefaulns.com"; var xmlDoc = $.parseXML(strin
xmlns:my=)确保在XML的字符串版本中已经声明了这个前缀http://mydefaulns.com“
在加载XML时在根级别声明。)
我尝试了以下方法:
var defaultNs="http://mydefaulns.com";
var xmlDoc = $.parseXML(stringXML);
$(xmlDoc).find("*").each(function() {
if (this.namespaceURI=== defaultNs) {
this.prefix = "my";
}
}
但是它没有影响,当我写回XML时,仍然没有前缀
我还尝试加载XML并调用:
xmlDoc.firstChild.removeAttribute("xmlns")
但是该属性没有被删除,因此前缀没有被神奇地更新
在这一点上,我认为获得我想要的结果的唯一方法是使用新的前缀名称重新创建所有节点,复制所有属性
这似乎真的很极端,还有别的办法吗
输入(字符串):
<abc xmlns="http://mydefaulns.com" xmlns:my="http://mydefaulns.com"xmlns:other="http://other.com">
<node1>Value</node1>
<other:node2>Value2</other:node2>
</abc>
<my:abc xmlns:my="http://mydefaulns.com"xmlns:other="http://other.com">
<my:node1>Value</my:node1>
<other:node2>Value2</other:node2>
</my:abc>
这可能对你有帮助
var inputXmlText='value2'
var inputXml=jQuery.parseXML(inputXmlText);
var列表=[];
var prefix=“my”;
$(inputXml).find(“*”).each(函数(){
如果(此.tagName.indexOf(“:”)不需要解析xml字符串,只需使用替换为正则表达式即可,如:
var prefix = "my:";
stringXML = stringXML.replace(/(<\/?)(\w+)(?!:)(\b)/g, "$1" + prefix + "$2$3");
在这一点上,我认为获得我想要的结果的唯一方法是使用新的前缀名称重新创建所有节点,复制所有属性
是的,如果你想干净利落地做,那正是你必须做的
使用正则表达式的解决方案是脆弱的。这是您给出的示例:
<abc xmlns="http://mydefaulns.com" xmlns:my="http://mydefaulns.com" xmlns:other="http://other.com">
<node1>Value</node1>
<other:node2>Value2</other:node2>
</abc>
您能发布一个小样本输入、输出,以及您写回xml的意思吗?我同意这有点粗糙,但从我的测试来看,还没有优雅的解决方案!:/我们将看看是否有人提出了其他解决方案!由于我们使用全局替换,我们可以缓存已处理的标记名。我通常在xml节点。标记名有什么区别?@Melanie标记名
与节点名
具有相同的值,标记名
仅存在于元素
,节点名
在任何节点
上我认为它对于更复杂的xml来说都是简单而灵活的。这与ibrahim mahir解决方案相比具有优势,它将为一个更复杂的xml工作ny元素名称。不确定使用了多少,但XML节点的字符数可以比regex word类多(例如,été是元素的有效名称)
<abc xmlns="http://mydefaulns.com" xmlns:my="http://mydefaulns.com" xmlns:other="http://other.com">
<node1>Value</node1>
<other:node2>Value2</other:node2>
</abc>
<abc xmlns="http://mydefaulns.com" xmlns:my="http://mydefaulns.com">
<node1>Value</node1>
<node2 xmlns="http://other.com">Value2</node2>
</abc>