i有一个包含部分XML片段的字符串,该字符串可能包含各种未宣布的名称空间,因此我使用的XML解析器无法解析(.net的XElement.Parse
):
<elements>
<removeThis:element attribute="value">
Contents
</removeThis:element>
</elements>
因此,在将字符串传递到XML解析器之前,我需要从字符串中剥离名称空间(我不需要名称空间,我只需要片段即可解析):
<elements>
<element attribute="value">
Contents
</element>
</elements>
有关实现此结果的方法的任何建议,例如正则表达式,或某种选择,我不喜欢.NET的XML解析器?
具有正则表达式的方法。如果XML不包含CData
并仅替换元素名称(不是属性)。
// read xml string
string input = File.ReadAllText(@"D:Temptext.txt");
// replace
string output = Regex.Replace(input, @"(<s*/?)s*(w+):(w+)", "$1$3");
示例xml:
<elements xmlns:removeThis="xmlnsname">
<removeThis:element attribute="value">
Contents
</removeThis:element>
</elements>
代码:
private static void RemoveNamespaces(XElement element)
{
// remove namespace prefix
element.Name = element.Name.LocalName;
// remove namespaces from children elements
foreach (var elem in element.Elements())
{
RemoveNamespaces(elem);
}
// remove namespace attributes
foreach (var attr in element.Attributes())
{
if (attr.IsNamespaceDeclaration)
{
attr.Remove();
}
}
}
用法(我将示例xml保存在文件'd: temp temp.txt'中):
var elem = XElement.Parse(File.ReadAllText(@"D:Temptext.txt"));
RemoveNamespaces(elem);
using (var writer = XmlWriter.Create(@"D:Temptext.txt", new XmlWriterSettings
{
Indent = true,
OmitXmlDeclaration = true,
}))
{
elem.WriteTo(writer);
}
结果:
<elements>
<element attribute="value">
Contents
</element>
</elements>