我有一些遗留的 XML 文档作为 blob 存储在数据库中,它们不是格式良好的 XML。我正在从 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 正则表达式可以很好地满足上述要求。但是,我需要如何更改正则表达式来更改它
<wsse:Security soapenv:actor="">
<BinarySecurityToken>authtoken</BinarySecurityToken>
</Security>
到这个?
<Security>
<BinarySecurityToken>authtoken</BinarySecurityToken>
</Security>
更新 2
认为我已经根据 Ria 的回答自己制定了更新版本,如下所示:
<(/?)\w+:(\w+/?) ?(\w+:\w+.*)?>