【问题标题】:Remove element namespace prefixes from XML string fragment从 XML 字符串片段中删除元素名称空间前缀
【发布时间】:2015-05-12 11:59:44
【问题描述】:

我有一个包含部分 XML 片段的字符串,它可能包含各种未声明的命名空间,因此我正在使用的 XML 解析器无法解析(.Net 的XElement.Parse):

<elements>
    <removeThis:element attribute="value">
        Contents
    </removeThis:element>
</elements>

所以在将字符串传递给 XML 解析器之前,我需要从字符串中剥离命名空间(我不需要命名空间,我只需要解析片段):

<elements>
    <element attribute="value">
        Contents
    </element>
</elements>

关于实现此结果的方法的任何建议,例如一个正则表达式,还是我在 .Net 的 XML 解析器中不知道的某个选项?

【问题讨论】:

标签: c# .net regex xml xml-parsing


【解决方案1】:

带有正则表达式的方法。如果 xml 不包含 CData 并且仅替换元素名称(而不是属性),则此方法有效。

// read xml string
string input = File.ReadAllText(@"D:\Temp\text.txt");

// replace
string output = Regex.Replace(input, @"(<\s*\/?)\s*(\w+):(\w+)", "$1$3");

【讨论】:

  • 很好,谢谢,经过快速初步测试后似乎运行良好
【解决方案2】:

示例 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:\Temp\text.txt"));
RemoveNamespaces(elem);
using (var writer = XmlWriter.Create(@"D:\Temp\text.txt", new XmlWriterSettings
    {
        Indent = true,
        OmitXmlDeclaration = true,
    }))
{
    elem.WriteTo(writer);
}

结果:

<elements>
  <element attribute="value">
        Contents
    </element>
</elements>

【讨论】:

  • 感谢您的回答,但输入是一个无法使用 XElement.Parse(string) 解析的字符串,因为缺少命名空间声明会导致此错误:“无法将输入解析为有效的 XDocument”
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2015-04-20
  • 2011-05-08
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多