从XML字符串片段中删除元素名称空间前缀



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>

最新更新