我有一些存储在数据库中的遗留XML文档,它们作为BLOB存储,并且不是格式良好的XML。我从SQL数据库中读取它们,最终,由于我使用C#.NET,希望将它们实例化为XMLDocument。
当我尝试这样做时,显然会出现XMLException。查看XML文档后,发现它们全部失败,原因是特定XML节点中存在未声明的命名空间。
我不关心具有此前缀的任何XML节点,所以可以忽略它们或将它们丢弃。因此,基本上,在将字符串加载为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+.*)?>
XDocument
、XElement
、XmlDocument
(如果你使用的是.NET 2.0)。 - Leri<!-- <ns:elem -->
),这可能会混淆正则表达式。 - svick