C# 如何用片段xml文件中的新数据完全替换其中一个节点?

C# 如何用片段xml文件中的新数据完全替换其中一个节点?,c#,xml,C#,Xml,我是这个论坛的新用户,我不是一个经验丰富的开发人员/程序员。在问这个问题之前,我搜索并查看了堆栈溢出和一些Microsoft建议的链接,但没有找到我要找的内容 我得到了以下XML文件: <?xml version="1.0" standalone="no" ?> <WndPos name="FrontEnd.Login" l="703" r="1264" t="323" b="909" /> <LayerManager /> <ViewLayers na

我是这个论坛的新用户,我不是一个经验丰富的开发人员/程序员。在问这个问题之前,我搜索并查看了堆栈溢出和一些Microsoft建议的链接,但没有找到我要找的内容

我得到了以下XML文件:

<?xml version="1.0" standalone="no" ?>
<WndPos name="FrontEnd.Login" l="703" r="1264" t="323" b="909" />
<LayerManager />
<ViewLayers name="RoofLayout" roof="1" nlwalls="1">
    <Layer level="-1" module="1" name="Walls" locked="0" visible="1" />
</ViewLayers>
<DirProfiles>
    <ProfileInfo ProfileName="ControlCQFT" JobPath="C:\Jobs" DatabasePath="D:\Database\ControlCQFT" />
</DirProfiles>
<DirHistory>
     <ProfileInfo Use="Job" Path="C:\Jobs" />
</DirHistory>

我需要替换整个
节点。传入节点可以为空,看起来像
。我要插入的新节点的格式为:

<DirProfiles> 
      <ProfileInfo ProfileName="Control1" JobPath="D:\Client1\JobsA" DatabasePath="D:\Database\Control1" />
. . . . .
</DirProfiles>

. . . . .
我试图用一个简单的字符串替换来处理这个问题,但没有得到我需要的结果

编辑:
抱歉,我没有意识到我的xml文件是片段xml文档,而不是规范规定的完整xml。

您可以将xml数据解析为C#类模型,然后可以根据需要更改数据。更改后,可以再次将模型对象解析为XML,并在同一文件上重写XML字符串

有关通过可用XML生成类结构的信息,请参阅此链接:

并使用此代码将Xml转换为C#类对象

public static T ConvertXmlToObject<T>(String xml)
    {
        T result = default(T);

        try
        {
            using (TextReader reader = new StringReader(xml))
            {
                try
                {
                    result =
                        (T)new XmlSerializer(typeof(T)).Deserialize(reader);
                }
                catch (InvalidOperationException)
                {
                    // Throw message for invalid XML
                }
            }
        }
        catch (Exception ex)
        {
        }

        return result;
    }
public static T ConvertXmlToObject(字符串xml)
{
T结果=默认值(T);
尝试
{
使用(TextReader=new StringReader(xml))
{
尝试
{
结果=
(T) 新的XmlSerializer(typeof(T))。反序列化(reader);
}
捕获(无效操作异常)
{
//抛出无效XML的消息
}
}
}
捕获(例外情况除外)
{
}
返回结果;
}
调用函数,如下所示:

var entity = ConvertXmlToObject<ModelClass>(XMLString);
string xmlString = ConvertObjectToXML<ModelClass>(ModelClassObject);
var entity=ConvertXmlToObject(XMLString);
使用此代码再次将对象转换为XML

public static string ConvertObjectToXML<T>(T ModelClass)
        {
            XmlSerializer xsObject = new XmlSerializer(typeof(T));
            var inputObject = ModelClass;
            var xmlString = "";

            using (var sw = new StringWriter())
            {
                using (XmlWriter writer = XmlWriter.Create(sw))
                {
                    xsObject.Serialize(writer, inputObject);
                    xmlString = sw.ToString();
                }
            }

            return xmlString;
        }
公共静态字符串ConvertObjectToXML(T ModelClass)
{
XmlSerializer xsObject=新的XmlSerializer(typeof(T));
var inputObject=ModelClass;
var xmlString=“”;
使用(var sw=new StringWriter())
{
使用(XmlWriter=XmlWriter.Create(sw))
{
序列化(writer,inputObject);
xmlString=sw.ToString();
}
}
返回xmlString;
}
调用此函数,如下所示:

var entity = ConvertXmlToObject<ModelClass>(XMLString);
string xmlString = ConvertObjectToXML<ModelClass>(ModelClassObject);
string xmlString=ConvertObjectToXML(ModelClassObject);

您可以将XML数据解析为C#类模型,然后根据需要进行数据更改。更改后,可以再次将模型对象解析为XML,并在同一文件上重写XML字符串

有关通过可用XML生成类结构的信息,请参阅此链接:

并使用此代码将Xml转换为C#类对象

public static T ConvertXmlToObject<T>(String xml)
    {
        T result = default(T);

        try
        {
            using (TextReader reader = new StringReader(xml))
            {
                try
                {
                    result =
                        (T)new XmlSerializer(typeof(T)).Deserialize(reader);
                }
                catch (InvalidOperationException)
                {
                    // Throw message for invalid XML
                }
            }
        }
        catch (Exception ex)
        {
        }

        return result;
    }
public static T ConvertXmlToObject(字符串xml)
{
T结果=默认值(T);
尝试
{
使用(TextReader=new StringReader(xml))
{
尝试
{
结果=
(T) 新的XmlSerializer(typeof(T))。反序列化(reader);
}
捕获(无效操作异常)
{
//抛出无效XML的消息
}
}
}
捕获(例外情况除外)
{
}
返回结果;
}
调用函数,如下所示:

var entity = ConvertXmlToObject<ModelClass>(XMLString);
string xmlString = ConvertObjectToXML<ModelClass>(ModelClassObject);
var entity=ConvertXmlToObject(XMLString);
使用此代码再次将对象转换为XML

public static string ConvertObjectToXML<T>(T ModelClass)
        {
            XmlSerializer xsObject = new XmlSerializer(typeof(T));
            var inputObject = ModelClass;
            var xmlString = "";

            using (var sw = new StringWriter())
            {
                using (XmlWriter writer = XmlWriter.Create(sw))
                {
                    xsObject.Serialize(writer, inputObject);
                    xmlString = sw.ToString();
                }
            }

            return xmlString;
        }
公共静态字符串ConvertObjectToXML(T ModelClass)
{
XmlSerializer xsObject=新的XmlSerializer(typeof(T));
var inputObject=ModelClass;
var xmlString=“”;
使用(var sw=new StringWriter())
{
使用(XmlWriter=XmlWriter.Create(sw))
{
序列化(writer,inputObject);
xmlString=sw.ToString();
}
}
返回xmlString;
}
调用此函数,如下所示:

var entity = ConvertXmlToObject<ModelClass>(XMLString);
string xmlString = ConvertObjectToXML<ModelClass>(ModelClassObject);
string xmlString=ConvertObjectToXML(ModelClassObject);
参见以下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;


namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            XElement doc = new XElement("Root");
            doc.Add(XElement.Parse(xml));

            XElement dirProfiles = doc.Descendants("DirProfiles").FirstOrDefault();

            XElement profileInfo = dirProfiles.Element("ProfileInfo");
            profileInfo.SetAttributeValue("ProfileName", "Control1");
            profileInfo.SetAttributeValue("JobPath", @"D:\Client1\JobsA");
            profileInfo.SetAttributeValue("DatabasePath", @"D:\Database\Control1");

        }
    }
}
见下文:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;


namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            XElement doc = new XElement("Root");
            doc.Add(XElement.Parse(xml));

            XElement dirProfiles = doc.Descendants("DirProfiles").FirstOrDefault();

            XElement profileInfo = dirProfiles.Element("ProfileInfo");
            profileInfo.SetAttributeValue("ProfileName", "Control1");
            profileInfo.SetAttributeValue("JobPath", @"D:\Client1\JobsA");
            profileInfo.SetAttributeValue("DatabasePath", @"D:\Database\Control1");

        }
    }
}

假设您的输入文件是一个不包含根节点的格式错误的XML文件,您可以通过一些字符串操作来解决这个问题

这是您所说的文件:

<?xml version="1.0" standalone="no" ?>
<WndPos name="FrontEnd.Login" l="703" r="1264" t="323" b="909" />
<LayerManager />
<ViewLayers name="RoofLayout" roof="1" nlwalls="1">
    <Layer level="-1" module="1" name="Walls" locked="0" visible="1" />
</ViewLayers>
<DirProfiles>
    <ProfileInfo ProfileName="ControlCQFT" JobPath="C:\Jobs" DatabasePath="D:\Database\ControlCQFT" />
</DirProfiles>
<DirHistory>
     <ProfileInfo Use="Job" Path="C:\Jobs" />
</DirHistory>

以下是如何使用它:

var sourceFileName = @"C:\{path}\xml_fragments.txt";

var text = $"<root>{String.Join(Environment.NewLine, File.ReadLines(sourceFileName).Skip(1))}</root>";

var doc = XDocument.Parse(text);

doc.Root.Element("DirProfiles").Elements().Remove();

doc.Root.Element("DirProfiles").Add(
    new XElement(
        "ProfileInfo",
        new XAttribute("ProfileName", "Control1"),
        new XAttribute("JobPath", @"D:\Client1\JobsA"),
        new XAttribute("DatabasePath", @"D:\Database\Control1")));
var sourceFileName=@“C:\{path}\xml\u fragments.txt”;
var text=$“{String.Join(Environment.NewLine,File.ReadLines(sourceFileName.Skip(1))}”;
var doc=XDocument.Parse(文本);
doc.Root.Element(“DirProfiles”).Elements().Remove();
文档根元素(“目录配置文件”)。添加(
新元素(
“ProfileInfo”,
新XAttribute(“ProfileName”、“Control1”),
新XAttribute(“作业路径,@“D:\Client1\JobsA”),
新的XAttribute(“DatabasePath”,@“D:\Database\Control1”);
这给了我:

<root>
  <WndPos name="FrontEnd.Login" l="703" r="1264" t="323" b="909" />
  <LayerManager />
  <ViewLayers name="RoofLayout" roof="1" nlwalls="1">
    <Layer level="-1" module="1" name="Walls" locked="0" visible="1" />
  </ViewLayers>
  <DirProfiles>
    <ProfileInfo ProfileName="Control1" JobPath="D:\Client1\JobsA" DatabasePath="D:\Database\Control1" />
  </DirProfiles>
  <DirHistory>
    <ProfileInfo Use="Job" Path="C:\Jobs" />
  </DirHistory>
</root>

如果您的输入文件是一个不包含根节点的格式错误的XML文件,您可以通过一些字符串操作来解决这个问题

这是您所说的文件:

<?xml version="1.0" standalone="no" ?>
<WndPos name="FrontEnd.Login" l="703" r="1264" t="323" b="909" />
<LayerManager />
<ViewLayers name="RoofLayout" roof="1" nlwalls="1">
    <Layer level="-1" module="1" name="Walls" locked="0" visible="1" />
</ViewLayers>
<DirProfiles>
    <ProfileInfo ProfileName="ControlCQFT" JobPath="C:\Jobs" DatabasePath="D:\Database\ControlCQFT" />
</DirProfiles>
<DirHistory>
     <ProfileInfo Use="Job" Path="C:\Jobs" />
</DirHistory>

以下是如何使用它:

var sourceFileName = @"C:\{path}\xml_fragments.txt";

var text = $"<root>{String.Join(Environment.NewLine, File.ReadLines(sourceFileName).Skip(1))}</root>";

var doc = XDocument.Parse(text);

doc.Root.Element("DirProfiles").Elements().Remove();

doc.Root.Element("DirProfiles").Add(
    new XElement(
        "ProfileInfo",
        new XAttribute("ProfileName", "Control1"),
        new XAttribute("JobPath", @"D:\Client1\JobsA"),
        new XAttribute("DatabasePath", @"D:\Database\Control1")));
var sourceFileName=@“C:\{path}\xml\u fragments.txt”;
var text=$“{String.Join(Environment.NewLine,File.ReadLines(sourceFileName.Skip(1))}”;
var doc=XDocument.Parse(文本);
doc.Root.Element(“DirProfiles”).Elements().Remove();
文档根元素(“目录配置文件”)。添加(
新元素(
“ProfileInfo”,
新XAttribute(“ProfileName”、“Control1”),
新XAttribute(“作业路径,@“D:\Client1\JobsA”),
新的XAttribute(“DatabasePath”,@“D:\Database\Control1”);
这给了我:

<root>
  <WndPos name="FrontEnd.Login" l="703" r="1264" t="323" b="909" />
  <LayerManager />
  <ViewLayers name="RoofLayout" roof="1" nlwalls="1">
    <Layer level="-1" module="1" name="Walls" locked="0" visible="1" />
  </ViewLayers>
  <DirProfiles>
    <ProfileInfo ProfileName="Control1" JobPath="D:\Client1\JobsA" DatabasePath="D:\Database\Control1" />
  </DirProfiles>
  <DirHistory>
    <ProfileInfo Use="Job" Path="C:\Jobs" />
  </DirHistory>
</root>