【问题标题】:Remove periods from XML tags从 XML 标记中删除句点
【发布时间】:2014-01-24 08:30:33
【问题描述】:

我有一个奇怪的问题,XML 在其中包含periods (.)。

<member>
    <name>ABCD</name>
        <value>         
             <date.of.birth>02.05.2000</date.of.birth>
        </value>                        
</member>

因此,我在解析 javascript 中的 XML 时遇到问题。我将此XML 转换为JSON 并使用JSON.parse()。

请让我知道是否有一种有效的方法可以将 XML 标签中的所有句点替换为下划线之类的 Javascript。类似下面的那个

<member>
    <name>ABCD</name>
        <value>         
                <date_of_birth>02.05.2000</date_of_birth>
        </value>                        
</member>

非常感谢。

【问题讨论】:

  • 酷,感谢您让我查看 XML 规范并了解到句点实际上是元素名称中的有效字符。 :-)
  • @Paul-Jan ...是的,句号实际上是一个有效字符。我最近也意识到了。 :)
  • @JonHanna ...我在开始时使用了下划线并且仍然可以正常工作。
  • @Kk_112688 该死!我完全写错了,它应该是:“事实上,标准是这样说的,“请注意,冒号、连字符减号、句号(句号)、低线(下划线)和中点是明确允许的。”尽管如此,只允许冒号和低行开始一个名字。'无论我的大脑在写上面的时候出现了什么错误,我都犯了两个错误;不仅名称开头允许使用低行,连字符减号也不允许。
  • @JonHanna ...感谢您的评论。请记住.. :)

标签: javascript xml json


【解决方案1】:

可以使用纯 JavaScript 完成解析:

var text = '<?xml version="1.0" encoding="UTF-8"?><member><name>ABCD</name><value><date.of.birth>02.05.2000</date.of.birth></value></member>';

if (window.DOMParser)
{
  var parser = new DOMParser();
  var xmlDoc = parser.parseFromString(text, "application/xml");
}
else // Internet Explorer
{
  var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async = false;
  xmlDoc.loadXML(text);
}

// access to you DOM elements:
var e = xmlDoc.getElementsByTagName('date.of.birth')[0] 

然后,要替换标签,您可以这样做:

var d = xmlDoc.createElement('date_of_birth');
d.innerHTML = e.innerHTML;
e.parentNode.insertBefore(d, e);
e.parentNode.removeChild(e);

// lets see what we have 
xmlDoc

更新:

为了在运行时找到具有特定标签名称的元素,我们可以这样做:

 var elements = xmlDoc.getElementsByTagName("*"); // get all them
 var matched_elements =[];
 for(var i=0; i<elements.length; i++)
 { 
   if ( /\./.test(elements[i].tagName) ) // our filter 
   { 
     matched_elements.push(elements[i]) 
   } 
 }
 matched_elements // contains what we expect

【讨论】:

  • 嗨@CodeGroover,我真的很喜欢这种方法。一个问题。我可以识别在运行时间中有句点的标签吗?
  • 我的意思是,在 XML 中可能还有其他具有不同标记名称的实例。它可以做得足够通用吗?类似 var e = xmlDoc.getElementsByTagName('.');
  • 是的,例如,您可以通过使用 'elementNode.childNodes' 属性迭代 DOM 树中的子节点并在每个节点上使用正则表达式匹配它来做到这一点。 (在评论中回答你的第一个问题)
  • @Kk_112688 通过更新我的主要答案回答了您在 cmets 中的第二个问题。见上文。
  • 非常感谢。这太棒了... :)
【解决方案2】:

使用 jQuery

我不确定在JavaScript 中执行此操作是否简单。

编辑:看看jQuery: how to change tag name?

使用 XSLT

但是,在XSLT 中执行此操作是。您只需将点命名标签与xsl:template 匹配,然后使用自定义名称重新创建它。

<xsl:template match="date.of.birth">
  <xsl:element name="replace(local-name(), '.', '_')">
    <xsl:value-of select="./text()" />
  </xsl:element>
</xsl:template>

在这里,我根据旧名称创建了一个 xsl:element replace .(点)_(下划线)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2014-10-15
    • 2015-02-28
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2019-12-28
    相关资源
    最近更新 更多