Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Javascript删除XML名称空间?_Javascript_Xml_Xml Namespaces - Fatal编程技术网

如何使用Javascript删除XML名称空间?

如何使用Javascript删除XML名称空间?,javascript,xml,xml-namespaces,Javascript,Xml,Xml Namespaces,我发现,就我的目的而言,XML名称空间只会引起很多头痛,而且完全没有必要。(例如,它们如何使xpath复杂化。) 有没有一种简单的方法可以完全从XML文档中删除名称空间 (有一个相关的问题,但它涉及删除标记上的名称空间前缀,而不是从文档根中删除名称空间声明:“”。) 编辑:以下示例和更多详细信息: XML: <?xml version="1.0" ?> <main xmlns="example.com"> <primary> <enabled

我发现,就我的目的而言,XML名称空间只会引起很多头痛,而且完全没有必要。(例如,它们如何使xpath复杂化。)

有没有一种简单的方法可以完全从XML文档中删除名称空间


(有一个相关的问题,但它涉及删除标记上的名称空间前缀,而不是从文档根中删除名称空间声明:“”。)

编辑:以下示例和更多详细信息:

XML:

<?xml version="1.0" ?>
<main xmlns="example.com">
  <primary>
    <enabled>true</enabled>
  </primary>
  <secondary>
    <enabled>false</enabled>
  </secondary>
</main>
function useHttpResponse()
{
    if (http.readyState == 4)
    {
        if(http.status == 200)
        {
            var xml = http.responseXML;
            var evalue = getXMLValueByPath('/main/secondary/enabled', xml);
            alert(evalue);
        }
    }
}

function getXMLValueByPath(nodepath, xml)
{
    var result = xml.evaluate(nodepath, xml, null, XPathResult.STRING_TYPE, null).stringValue;
    return result;
}
示例XML与我正在使用的实际XML非常相似,尽管要短得多。请注意,名称空间的标记上没有前缀。我假设这是null或默认名称空间

JavaScript是我的ajax函数的一个片段。如果我从
main
标记中删除
xmlns=“example.com”
部分,我就能够成功地获取值。只要存在任何名称空间,该值就会变得未定义

编辑2:

<?xml version="1.0" ?>
<main xmlns="example.com">
  <primary>
    <enabled>true</enabled>
  </primary>
  <secondary>
    <enabled>false</enabled>
  </secondary>
</main>
function useHttpResponse()
{
    if (http.readyState == 4)
    {
        if(http.status == 200)
        {
            var xml = http.responseXML;
            var evalue = getXMLValueByPath('/main/secondary/enabled', xml);
            alert(evalue);
        }
    }
}

function getXMLValueByPath(nodepath, xml)
{
    var result = xml.evaluate(nodepath, xml, null, XPathResult.STRING_TYPE, null).stringValue;
    return result;
}

值得一提的是,XML标记中没有实际使用任何声明的名称空间(如上面的示例)。在我使用的实际XML文件中,声明了三个名称空间,但没有使用名称空间引用作为前缀的标记。因此,也许问题应该重新命名为“如何使用Javascript删除未使用的XML名称空间?”如果名称空间1)从未使用过,2)使用xpath使节点的简单路径复杂化,我看不到保留名称空间的理由。

这应该删除您发现的任何名称空间声明:

var xml = http.responseXML.replace(/<([a-zA-Z0-9 ]+)(?:xml)ns=\".*\"(.*)>/g, "<$1$2>");
var xml=http.responseXML.replace(//g,”);

以替换XML javascript字符串中的所有xmlns属性

你可以试试下面的正则表达式

xmlns=\"(.*?)\"
注意:这个正则表达式可以用来替换任何属性

var str=`
真的
假的
`;
str=str.replace(/xmlns=\“(.*?\”)”/g';

console.log(str)
名称空间在需要之前没有任何价值。讽刺的是,名称空间的开发显然是为了允许重复标记并避免它们之间的混淆。我有不同父标记的重复标记,我正在尝试使用xpath来选择它们。如果手动删除名称空间声明,则选择元素非常简单。如果名称空间声明保持不变,它将完全失败。为什么不寻求有关使用名称空间的帮助而不是放弃呢?名称空间不应该使xpath变得复杂,特别是,您只需在运行时为xpath中的部分命名。也许更好的办法是找出xpath不起作用的原因,而不是剥离结构数据?“但它处理的是删除标记上的名称空间,而不是从整个文档中”——您能解释一下区别吗?您的意思是要删除命名空间声明吗?名称空间前缀?除了从标记中删除名称空间之外,从整个文档中删除名称空间意味着什么?会导致Javascript控制台错误:
http.responseXML.replace不是一个函数
@JY:您可以通过在调用replace()方法之前将responseXML转换为字符串来强制执行此操作。但它并不健壮,因为您没有真正解析XML@安德烈:你确定正则表达式是正确的吗?你能解释一下正则表达式是正确的吗。您提到的部分只是获取标记名和后面的空格,因此,在
中,它将用
@LarsH替换它:将它转换为字符串当然是一个选项,以使替换函数工作。但是,它需要转换回XML。我需要关于如何做的建议(使用某种字符串解析重新创建XML文档?。@andre:在我看来,您希望空格位于
]+
之后,而不是与标记名的字母数字混合多次。此外,正则表达式最多只能替换一个默认的名称空间声明,而不是所有的名称空间声明。但这可能就是@JYelton所需要的。。。