为了账号安全,请及时绑定邮箱和手机立即绑定

如何用C#从XML中删除所有名称空间?

/ 猿问

如何用C#从XML中删除所有名称空间?

墨色风雨 2019-10-20 16:08:00

如何用C#从XML中删除所有名称空间?

我正在寻找干净、优雅和智能的解决方案来从所有XML元素中删除名称空间?这样做会有什么作用呢?

定义的接口:

public interface IXMLUtils{
        string RemoveAllNamespaces(string xmlDocument);}

从以下位置删除NS的示例XML:

<?xml version="1.0" encoding="utf-16"?><ArrayOfInserts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:
xsd="http://www.w3.org/2001/XMLSchema">
  <insert>
    <offer xmlns="http://schema.peters.com/doc_353/1/Types">0174587</offer>
    <type2 xmlns="http://schema.peters.com/doc_353/1/Types">014717</type2>
    <supplier xmlns="http://schema.peters.com/doc_353/1/Types">019172</supplier>
    <id_frame xmlns="http://schema.peters.com/doc_353/1/Types" />
    <type3 xmlns="http://schema.peters.com/doc_353/1/Types">
      <type2 />
      <main>false</main>
    </type3>
    <status xmlns="http://schema.peters.com/doc_353/1/Types">Some state</status>
  </insert></ArrayOfInserts>

在调用RemoveAllNamesspace(XmlWithLotOfns)之后,我们应该得到:

  <?xml version="1.0" encoding="utf-16"?>
    <ArrayOfInserts>
      <insert>
        <offer >0174587</offer>
        <type2 >014717</type2>
        <supplier >019172</supplier>
        <id_frame  />
        <type3 >
          <type2 />
          <main>false</main>
        </type3>
        <status >Some state</status>
      </insert>
    </ArrayOfInserts>

预编写的解决方案语言是.NET 3.5SP1上的C#。


查看完整描述

3 回答

?
尚方宝剑之说

这是最后的答案。我使用了很好的JimmyIdea(不幸的是,它本身还不完整)和完整的递归函数来正常工作。

基于接口:

string RemoveAllNamespaces(string xmlDocument);

我在这里代表了删除XML命名空间的最后一个干净通用的C#解决方案:

//Implemented based on interface, not part of algorithmpublic static string RemoveAllNamespaces(string xmlDocument){
    XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(xmlDocument));

    return xmlDocumentWithoutNs.ToString();}//Core recursion function
 private static XElement RemoveAllNamespaces(XElement xmlDocument)
    {
        if (!xmlDocument.HasElements)
        {
            XElement xElement = new XElement(xmlDocument.Name.LocalName);
            xElement.Value = xmlDocument.Value;

            foreach (XAttribute attribute in xmlDocument.Attributes())
                xElement.Add(attribute);

            return xElement;
        }
        return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el)));
    }

它是100%的工作,但我还没有对它进行太多的测试,所以它可能不包括一些特殊的情况.但这是一个良好的开端。



查看完整回答
反对 回复 2019-10-21
?
湖上湖

最有用的答案有两个缺陷:

  • 它忽略属性。
  • 它不适用于“混合模式”元素

以下是我对此的看法:

 public static XElement RemoveAllNamespaces(XElement e)
 {
    return new XElement(e.Name.LocalName,
      (from n in e.Nodes()
        select ((n is XElement) ? RemoveAllNamespaces(n as XElement) : n)),
          (e.HasAttributes) ? 
            (from a in e.Attributes() 
               where (!a.IsNamespaceDeclaration)  
               select new XAttribute(a.Name.LocalName, a.Value)) : null);
  }

样本代码这里.



查看完整回答
反对 回复 2019-10-21
?
阿波罗的战车

使用LINQ的强制性回答:

static XElement stripNS(XElement root) {
    return new XElement(
        root.Name.LocalName,
        root.HasElements ? 
            root.Elements().Select(el => stripNS(el)) :
            (object)root.Value
    );}static void Main() {
    var xml = XElement.Parse(@"<?xml version=""1.0"" encoding=""utf-16""?>
    <ArrayOfInserts xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
      <insert>
        <offer xmlns=""http://schema.peters.com/doc_353/1/Types"">0174587</offer>
        <type2 xmlns=""http://schema.peters.com/doc_353/1/Types"">014717</type2>
        <supplier xmlns=""http://schema.peters.com/doc_353/1/Types"">019172</supplier>
        <id_frame xmlns=""http://schema.peters.com/doc_353/1/Types"" />
        <type3 xmlns=""http://schema.peters.com/doc_353/1/Types"">
          <type2 />
          <main>false</main>
        </type3>
        <status xmlns=""http://schema.peters.com/doc_353/1/Types"">Some state</status>
      </insert>
    </ArrayOfInserts>");
    Console.WriteLine(stripNS(xml));}



查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信