【问题标题】:Fast replacement node names in XMLXML 中的快速替换节点名称
【发布时间】:2016-12-13 18:06:00
【问题描述】:

我使用管理 Fetch CRM 的旧服务:crmService.Fetch(fetchXml)

我得到如下 XML 字符串结果:

<resultset>
<result>
<new_categoria name="Cliente" formattedvalue="1">1</new_categoria>
<new_name>Admin</new_name>
<new_tipodecampanaid>{F8F29978-4E0F-AE92-FB43-48B4DC406B1F}</new_tipodecampanaid>
<statuscode name="Activo">0</statuscode>
</result>

<result>
<new_categoria name="Client" formattedvalue="1">1</new_categoria>
<new_name>Client</new_name>
<new_tipodecampanaid>{758341BA-4661-D694-6743-8D2DC875793E}</new_tipodecampanaid>
<statuscode name="Activo">0</statuscode>
</result>

<result>

</resultset>

我们需要(因为 alias 不支持 Fetch 方法)替换几个 节点名称

1 - 将 new_categoria 节点名称替换为 org_category

2 - 将 new_name 节点名称替换为 org_name

3 - 将 new_tipodecampanaid 节点名称替换为 org_campaignid

我们需要高性能,也许结果会是巨大的。

使用XmlDocument

var doc = new XmlDocument();
doc.LoadXml(fetchXMLResult);

XmlNode root = doc.SelectSingleNode("resultset");
foreach (XmlNode childNode in root.ChildNodes)
{

}

使用XDocument

XDocument resultset = XDocument.Parse(fetchXMLResult);
if (resultset.Root == null || !resultset.Root.Elements("result").Any())
{
    return;
}
resultset.Root.Elements("result")

有什么建议吗?

【问题讨论】:

    标签: c# xml linq-to-xml xmldocument fetchxml


    【解决方案1】:

    为了提高速度,您可以使用XmlReader 运行文件,并使用XmlWriter 将您读取的每个节点写入一个新文件。

    有关示例,请参阅 this link

    【讨论】:

      【解决方案2】:

      当您有大型 xml 文件时,请始终使用 XmlReader。试试这个代码

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Xml;
      using System.Xml.Linq;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              const string INPUT_FILENAME = @"c:\temp\test1.xml";
              const string OUTPUT_FILENAME = @"c:\temp\test2.xml";
              static void Main(string[] args)
              {
                  XmlReader reader = XmlReader.Create(INPUT_FILENAME);
                  XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME);
      
                  writer.WriteStartElement("resultset");
                  while (!reader.EOF)
                  {
                      if (reader.Name != "result")
                      {
                          reader.ReadToFollowing("result");
                      }
                      if (!reader.EOF)
                      {
                          XElement result = (XElement)XElement.ReadFrom(reader);
                          result.Element("new_categoria").Name = "org_category";
                          result.Element("new_name").Name = "org_name";
                          result.Element("new_tipodecampanaid").Name = "org_campaignid";
      
                          writer.WriteRaw(result.ToString());
                      }
                  }
                  writer.WriteEndElement();
                  writer.Flush();
                  writer.Close();
      
              }
          }
      }
      

      【讨论】:

      • 使用以下:string xml = ""; StringReader sReader = new StringReader(xml); XmlReader 阅读器 = XmlReader.Create(sReader);
      • 答案中可能包含注释代码。查看stackoverflow.com/questions/4518544/…记住:XmlReader 和 StringReader 实现 IDisposable。
      猜你喜欢
      • 2013-09-07
      • 1970-01-01
      • 2016-06-05
      • 2012-03-10
      • 2014-08-27
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多