[英]Removing an XML Nodes namespace prefix from a XML string with Regex
我有一些旧的XML文档作为Blob存储在数据库中,它们的格式不正确。 我正在从SQL数据库读取它们,最终,当我使用C#.NET时,我想将它们实例化为XMLDocument。
当我尝试执行此操作时,显然会得到XMLException。 查看了XML文档后,由于特定XML节点中未声明的名称空间,它们都失败了。
我不关心具有此前缀的任何XML节点,因此我可以忽略它们或将其丢弃。 因此,基本上,在将字符串加载为XMLDocument之前,我想删除字符串中的前缀,以便
<tem:GetRouteID>
<tem:PostCode>postcode</tem:PostCode>
<tem:Type>ItemType</tem:Type>
</tem:GetRouteID>
变成
<GetRouteID>
<PostCode>postcode</PostCode>
<Type>ItemType</Type>
</GetRouteID>
和这个
<wsse:Security soapenv:actor="">
<wsse:BinarySecurityToken>token</wsse:BinarySecurityToken>
</wsse:Security>
变成这个:
<Security soapenv:actor="">
<BinarySecurityToken>token</BinarySecurityToken>
</Security>
我有一个解决方案,它是这样的:
<appSettings>
<add key="STRIP_NAMESPACES" value="wsse;tem" />
</appSettings>
if (STRIP_NAMESPACES != null)
{
string[] namespaces = Regex.Split(STRIP_NAMESPACES, ";");
foreach (string ns in namespaces)
{
str2 = str2.Replace("<" + ns + ":", "<"); // Replace opening tag
str2 = str2.Replace("</" + ns + ":", "</"); // Replace closing tag
}
}
但理想情况下,我希望采用一种通用方法,因此不必无休止地配置要删除的名称空间。
如何在C#.NET中实现此目标。 我假设正则表达式是去这里的方式吗?
更新1
以下Ria的Regex可以很好地满足上述要求。 但是,我将如何更改正则表达式以更改此内容
<wsse:Security soapenv:actor="">
<BinarySecurityToken>authtoken</BinarySecurityToken>
</Security>
对此吗?
<Security>
<BinarySecurityToken>authtoken</BinarySecurityToken>
</Security>
更新2
认为我已经根据Ria的答案自己制定了更新版本,如下所示:
<(/?)\w+:(\w+/?) ?(\w+:\w+.*)?>
更新
对于新问题(attribs名称空间),请尝试此常规解决方案。 这对节点值没有影响:
Regex.Replace(originalXml,
@"((?<=</?)\w+:(?<elem>\w+)|\w+:(?<elem>\w+)(?==\"))",
"${elem}");
在我的示例xml上尝试使用此正则表达式:
<wsse:Security soapenv:actor="dont match soapenv:actor attrib">
<BinarySecurityToken>authtoken</BinarySecurityToken>
</Security>
尝试使用XSL
,您可以直接应用XSL
或在.NET中使用XslTransform
类:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/|comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
或尝试使用此正则Regex
:
var finalXml = Regex.Replace(originalXml, @"<(/?)\w+:(\w+/?)>", "<$1$2>");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.