如何使用XMLWriterClass在C#中生成以下Xml代码?

如何使用XMLWriterClass在C#中生成以下Xml代码?,c#,xmlwriter,C#,Xmlwriter,我正试图得到这个: <ATCWaypointEnd id="KLKP"> </ATCWaypointEnd> <ATCWaypointEnd id="KLKP"></ATCWaypointEnd> 我建议创建一个类来表示XML文件,然后使用序列化。这样,您就可以让框架创建XML元素,并且可以轻松地指定它是否应该包含换行符(缩进) 您还可以使用外部工具生成POCO类,例如

我正试图得到这个:

      <ATCWaypointEnd id="KLKP">
      </ATCWaypointEnd>
      <ATCWaypointEnd id="KLKP"></ATCWaypointEnd>

我建议创建一个类来表示XML文件,然后使用序列化。这样,您就可以让框架创建XML元素,并且可以轻松地指定它是否应该包含换行符(缩进)

您还可以使用外部工具生成POCO类,例如:

使用您提供的xml片段:

// The class representing the XML file
[XmlRoot(ElementName="ATCWaypointEnd")]
public class ATCWaypointEnd 
{
    [XmlAttribute(AttributeName="id")]
    public string Id { get; set; }
}

// The method that will return the object as a XML string
public static string GenerateXml(ATCWaypointEnd obj)
{
    string xml;
    using (var stream = new MemoryStream())
    {
        var serializer = new XmlSerializer(typeof(ATCWaypointEnd));
        
        var writer = new XmlTextWriter(stream, encoding);
        writer.Formatting = Formatting.Indented; // Here

        serializer.Serialize(writer, obj);
        xml = encoding.GetString(stream.ToArray());
    }
    return xml;
}
然后在您的代码中,您可以这样使用:

var obj = new ATCWaypointEnd();
obj.Id = "KLKP";

var xml = GenerateXml(obj);

您可以执行以下操作:

writer.WriteStartElement("ATCWaypointEnd");
writer.WriteAttributeString("id", ICAO); 
writer.WriteString(System.Environment.NewLine);
writer.WriteFullEndElement(); 
完整代码见下文:

添加以下“使用”语句:

using System.Xml;
using System.IO;
选项1:

private void WriteXmlData(string ICAO, string filename)
{

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;

    string dirName = System.IO.Path.GetDirectoryName(filename);


    if (!System.IO.Directory.Exists(dirName))
    {
        System.Diagnostics.Debug.WriteLine("Output folder doesn't exist. Creating.");

        //create folder if it doesn't exist
        System.IO.Directory.CreateDirectory(dirName);
    }

    using (XmlWriter writer = XmlWriter.Create(filename, settings))
    {
        writer.WriteStartDocument();

        writer.WriteStartElement("ATCWaypointEnd");
        writer.WriteAttributeString("id", ICAO);
        writer.WriteString(System.Environment.NewLine);
        writer.WriteFullEndElement(); 

        writer.WriteEndDocument();

        writer.Close();
        writer.Dispose();
    }

}
WriteXmlData("KLKP", @"C:\Temp\test.xml");
private string WriteXmlData(string ICAO)
{
    string xmlOutput = string.Empty;

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;


    using (MemoryStream ms = new MemoryStream())
    {
        using (XmlWriter writer = XmlWriter.Create(ms, settings))
        {
            writer.WriteStartDocument();

            writer.WriteStartElement("ATCWaypointEnd");
            writer.WriteAttributeString("id", ICAO); 
            writer.WriteString(System.Environment.NewLine);
            writer.WriteFullEndElement(); 

            writer.WriteEndDocument();

            writer.Close();
            writer.Dispose();
        }

        //reset position
        ms.Position = 0;
        using (StreamReader sr = new StreamReader(ms))
        {
            //put XML into string
            xmlOutput = sr.ReadToEnd();

            //clean up
            sr.Close();
            sr.Dispose();
        }

        //clean up
        ms.Close();
        ms.Dispose();
    }

    return xmlOutput;
}
string output = WriteXmlData("KLKP");
用法:

private void WriteXmlData(string ICAO, string filename)
{

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;

    string dirName = System.IO.Path.GetDirectoryName(filename);


    if (!System.IO.Directory.Exists(dirName))
    {
        System.Diagnostics.Debug.WriteLine("Output folder doesn't exist. Creating.");

        //create folder if it doesn't exist
        System.IO.Directory.CreateDirectory(dirName);
    }

    using (XmlWriter writer = XmlWriter.Create(filename, settings))
    {
        writer.WriteStartDocument();

        writer.WriteStartElement("ATCWaypointEnd");
        writer.WriteAttributeString("id", ICAO);
        writer.WriteString(System.Environment.NewLine);
        writer.WriteFullEndElement(); 

        writer.WriteEndDocument();

        writer.Close();
        writer.Dispose();
    }

}
WriteXmlData("KLKP", @"C:\Temp\test.xml");
private string WriteXmlData(string ICAO)
{
    string xmlOutput = string.Empty;

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;


    using (MemoryStream ms = new MemoryStream())
    {
        using (XmlWriter writer = XmlWriter.Create(ms, settings))
        {
            writer.WriteStartDocument();

            writer.WriteStartElement("ATCWaypointEnd");
            writer.WriteAttributeString("id", ICAO); 
            writer.WriteString(System.Environment.NewLine);
            writer.WriteFullEndElement(); 

            writer.WriteEndDocument();

            writer.Close();
            writer.Dispose();
        }

        //reset position
        ms.Position = 0;
        using (StreamReader sr = new StreamReader(ms))
        {
            //put XML into string
            xmlOutput = sr.ReadToEnd();

            //clean up
            sr.Close();
            sr.Dispose();
        }

        //clean up
        ms.Close();
        ms.Dispose();
    }

    return xmlOutput;
}
string output = WriteXmlData("KLKP");
选项2:

private void WriteXmlData(string ICAO, string filename)
{

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;

    string dirName = System.IO.Path.GetDirectoryName(filename);


    if (!System.IO.Directory.Exists(dirName))
    {
        System.Diagnostics.Debug.WriteLine("Output folder doesn't exist. Creating.");

        //create folder if it doesn't exist
        System.IO.Directory.CreateDirectory(dirName);
    }

    using (XmlWriter writer = XmlWriter.Create(filename, settings))
    {
        writer.WriteStartDocument();

        writer.WriteStartElement("ATCWaypointEnd");
        writer.WriteAttributeString("id", ICAO);
        writer.WriteString(System.Environment.NewLine);
        writer.WriteFullEndElement(); 

        writer.WriteEndDocument();

        writer.Close();
        writer.Dispose();
    }

}
WriteXmlData("KLKP", @"C:\Temp\test.xml");
private string WriteXmlData(string ICAO)
{
    string xmlOutput = string.Empty;

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;


    using (MemoryStream ms = new MemoryStream())
    {
        using (XmlWriter writer = XmlWriter.Create(ms, settings))
        {
            writer.WriteStartDocument();

            writer.WriteStartElement("ATCWaypointEnd");
            writer.WriteAttributeString("id", ICAO); 
            writer.WriteString(System.Environment.NewLine);
            writer.WriteFullEndElement(); 

            writer.WriteEndDocument();

            writer.Close();
            writer.Dispose();
        }

        //reset position
        ms.Position = 0;
        using (StreamReader sr = new StreamReader(ms))
        {
            //put XML into string
            xmlOutput = sr.ReadToEnd();

            //clean up
            sr.Close();
            sr.Dispose();
        }

        //clean up
        ms.Close();
        ms.Dispose();
    }

    return xmlOutput;
}
string output = WriteXmlData("KLKP");
用法:

private void WriteXmlData(string ICAO, string filename)
{

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;

    string dirName = System.IO.Path.GetDirectoryName(filename);


    if (!System.IO.Directory.Exists(dirName))
    {
        System.Diagnostics.Debug.WriteLine("Output folder doesn't exist. Creating.");

        //create folder if it doesn't exist
        System.IO.Directory.CreateDirectory(dirName);
    }

    using (XmlWriter writer = XmlWriter.Create(filename, settings))
    {
        writer.WriteStartDocument();

        writer.WriteStartElement("ATCWaypointEnd");
        writer.WriteAttributeString("id", ICAO);
        writer.WriteString(System.Environment.NewLine);
        writer.WriteFullEndElement(); 

        writer.WriteEndDocument();

        writer.Close();
        writer.Dispose();
    }

}
WriteXmlData("KLKP", @"C:\Temp\test.xml");
private string WriteXmlData(string ICAO)
{
    string xmlOutput = string.Empty;

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = false;
    settings.NewLineChars = Environment.NewLine;


    using (MemoryStream ms = new MemoryStream())
    {
        using (XmlWriter writer = XmlWriter.Create(ms, settings))
        {
            writer.WriteStartDocument();

            writer.WriteStartElement("ATCWaypointEnd");
            writer.WriteAttributeString("id", ICAO); 
            writer.WriteString(System.Environment.NewLine);
            writer.WriteFullEndElement(); 

            writer.WriteEndDocument();

            writer.Close();
            writer.Dispose();
        }

        //reset position
        ms.Position = 0;
        using (StreamReader sr = new StreamReader(ms))
        {
            //put XML into string
            xmlOutput = sr.ReadToEnd();

            //clean up
            sr.Close();
            sr.Dispose();
        }

        //clean up
        ms.Close();
        ms.Dispose();
    }

    return xmlOutput;
}
string output = WriteXmlData("KLKP");

什么是国际民航组织?(不幸的是,德语的评论在这里没有帮助。)如果你能提供一个答案,那将非常有帮助。到底是什么问题?新线?。我认为库返回的是格式化的
XML
,因此不能创建新行(这是不相关的)。@Jon Skeet:CAO是一个字符串变量。@J.F.是的,新行。“一个字符串变量”确实不能告诉我们太多。再次,请提供一个。谢谢你的推荐。我不是程序员,你有一个完整的例子来说明我如何使用类来实现这一点吗?首先,你需要定义表示XML的类。有一些工具可以输入完整的xml,它将返回de c#类,就像我提到的那个。之后,您可以使用XmlSerializer类以字符串表示形式生成XML,如答案中提供的方法。非常感谢,我将尝试此方法如果它解决了您的问题,请将标记作为解决方案。如果没有,请告诉我,以便更新答案。我已尝试创建该类,但遇到错误。