programing

C#에서 XML을 작성하려면 어떻게 해야 합니까?

megabox 2023. 10. 11. 20:36
반응형

C#에서 XML을 작성하려면 어떻게 해야 합니까?

C#에서 유효한 XML을 생성하려면 어떻게 해야 합니까?

시나리오에 따라 다릅니다.XmlSerializer는 확실히 한 방향이며 객체 모델에 직접 매핑할 수 있는 장점이 있습니다..NET 3.5에서,XDocument, 그 외에도 매우 친절합니다.만약 사이즈가 매우 크다면,XmlWriter당신의 친구입니다.

한번쯤은XDocument예:

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));

또는 동일한 경우XmlDocument:

XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);

대규모 데이터 스트림을 작성하는 경우 DOM 접근 방식(예:XmlDocument/XDocument, 등)은 빠르게 많은 메모리를 필요로 합니다.따라서 CSV에서 100MB XML 파일을 작성하는 경우 다음을 고려할 수 있습니다.XmlWriter; 이것은 더 원시적이지만(한 번 쓰기 가능한 파이어호스) 매우 효율적입니다(여기서는 큰 루프를 imagine합니다).

XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();

마지막으로 경유.XmlSerializer:

[Serializable]
public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
    public string Nested { get; set; }
}
...
Foo foo = new Foo
{
    Bar = "some & value",
    Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);

이것은 수업 등에 매핑하기에 좋은 모델입니다.; 그러나 단순한 작업을 수행하는 경우(또는 원하는 XML이 개체 모델과 직접적인 상관 관계가 없는 경우)에는 과도한 작업일 수 있습니다.의 또 다른 문제XmlSerializer모든 것은 퍼블릭 게터(public getter)와 세터(setter)가 있어야 합니다(구현하여 모든 것을 스스로 하지 않는 한).IXmlSerializable, 이 경우에 당신은 당신이 그를 이용해서 얻은 것이 별로 없습니다.XmlSerializer).

제가 시도한 가장 좋은 것은 대부분의 개발자들이 모르는 LINQ to XSD입니다.XSD 스키마를 지정하면 백그라운드에서 사용자를 위해 완벽하게 매핑된 완전한 강력한 유형의 객체 모델(LINQ to XML 기준)을 생성하므로 작업하기가 매우 쉽습니다. 또한 객체 모델과 XML을 실시간으로 업데이트하고 검증합니다.아직 "미리보기"이지만 버그가 발생한 적은 없습니다.

다음과 같은 XSD 스키마가 있는 경우:

  <xs:element name="RootElement">
     <xs:complexType>
      <xs:sequence>
        <xs:element name="Element1" type="xs:string" />
        <xs:element name="Element2" type="xs:string" />
      </xs:sequence>
       <xs:attribute name="Attribute1" type="xs:integer" use="optional" />
       <xs:attribute name="Attribute2" type="xs:boolean" use="required" />
     </xs:complexType>
  </xs:element>

그러면 다음과 같이 간단히 XML을 작성할 수 있습니다.

RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;

또는 다음과 같이 파일에서 XML을 로드하기만 하면 됩니다.

RootElement rootElement = RootElement.Load(filePath);

또는 다음과 같이 저장합니다.

rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);

rootElement.Untyped또한 요소를 XElement(LINQ에서 XML로) 형태로 만듭니다.

new XElement("Foo",
       from s in nameValuePairList
       select
             new XElement("Bar",
                  new XAttribute("SomeAttr", "SomeAttrValue"),
                          new XElement("Name", s.Name),
                          new XElement("Value", s.Value)
                         )
            );

XmlWriter는 좋은 XML을 쓰는 가장 빠른 방법입니다. XDocument, XMLDocument 등도 잘 작동하지만 XML을 쓰는 데 최적화되어 있지는 않습니다. XML을 가능한 한 빨리 쓰고 싶다면 XmlWriter를 사용해야 합니다.

과거에 나는 XML 스키마를 만든 다음 해당 스키마로 직렬화할 C# 클래스를 생성하기 위해 도구를 사용했습니다.XML 스키마 정의 도구(XML Schema Definition Tool)가 그 예입니다.

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

이 리소스는 적당한 XML 저장/로드를 위해 충분해야 한다고 생각합니다. C#을 사용한 XML 읽기/쓰기입니다.

저의 임무는 음악적 기보를 저장하는 것이었습니다.저는 XML을 선택합니다. 왜냐하면 제 생각에는요.NET은 작업을 쉽게 해결할 수 있을 만큼 성숙해졌습니다.제가 옳았습니다 :)

이건 제 노래 파일 프로토타입입니다.

<music judul="Kupu-Kupu yang Lucu" pengarang="Ibu Sud" tempo="120" birama="4/4" nadadasar="1=F" biramapembilang="4" biramapenyebut="4">
    <not angka="1" oktaf="0" naikturun="" nilai="1"/>
    <not angka="2" oktaf="0" naikturun="" nilai="0.5"/>
    <not angka="5" oktaf="1" naikturun="/" nilai="0.25"/>
    <not angka="2" oktaf="0" naikturun="\" nilai="0.125"/>
    <not angka="1" oktaf="0" naikturun="" nilai="0.0625"/>
</music>

이는 매우 쉽게 해결할 수 있습니다.

파일에 저장할 경우:

 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
 {
     saveFileDialog1.Title = "Save Song File";
     saveFileDialog1.Filter = "Song Files|*.xsong";
     if (saveFileDialog1.ShowDialog() == DialogResult.OK)
     {
         FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
         XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);
         w.WriteStartDocument();
         w.WriteStartElement("music");
         w.WriteAttributeString("judul", Program.music.getTitle());
         w.WriteAttributeString("pengarang", Program.music.getAuthor());
         w.WriteAttributeString("tempo", Program.music.getTempo()+"");
         w.WriteAttributeString("birama", Program.music.getBirama());
         w.WriteAttributeString("nadadasar", Program.music.getNadaDasar());
         w.WriteAttributeString("biramapembilang", Program.music.getBiramaPembilang()+"");
         w.WriteAttributeString("biramapenyebut", Program.music.getBiramaPenyebut()+"");

         for (int i = 0; i < listNotasi.Count; i++)
         {
             CNot not = listNotasi[i];
             w.WriteStartElement("not");
             w.WriteAttributeString("angka", not.getNot() + "");
             w.WriteAttributeString("oktaf", not.getOktaf() + "");
             String naikturun="";
             if(not.isTurunSetengah())naikturun="\\";
             else if(not.isNaikSetengah())naikturun="/";
             w.WriteAttributeString("naikturun",naikturun);
             w.WriteAttributeString("nilai", not.getNilaiNot()+"");
             w.WriteEndElement();
         }
         w.WriteEndElement();

         w.Flush();
         fs.Close();
     }

 }

로드 파일의 경우:

openFileDialog1.Title = "Open Song File";
openFileDialog1.Filter = "Song Files|*.xsong";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
    XmlTextReader r = new XmlTextReader(fs);

    while (r.Read())
    {
        if (r.NodeType == XmlNodeType.Element)
        {
            if (r.Name.ToLower().Equals("music"))
            {
                Program.music = new CMusic(r.GetAttribute("judul"),
                    r.GetAttribute("pengarang"),
                    r.GetAttribute("birama"),
                    Convert.ToInt32(r.GetAttribute("tempo")),
                    r.GetAttribute("nadadasar"),
                    Convert.ToInt32(r.GetAttribute("biramapembilang")),
                    Convert.ToInt32(r.GetAttribute("biramapenyebut")));
            }
            else
                if (r.Name.ToLower().Equals("not"))
                {
                    CNot not = new CNot(Convert.ToInt32(r.GetAttribute("angka")), Convert.ToInt32(r.GetAttribute("oktaf")));
                    if (r.GetAttribute("naikturun").Equals("/"))
                    {
                        not.setNaikSetengah();
                    }
                    else if (r.GetAttribute("naikturun").Equals("\\"))
                    {
                        not.setTurunSetengah();
                    }
                    not.setNilaiNot(Convert.ToSingle(r.GetAttribute("nilai")));
                    listNotasi.Add(not);
                }
        }
        else
            if (r.NodeType == XmlNodeType.Text)
            {
                Console.WriteLine("\tVALUE: " + r.Value);
            }
    }
}

}
}

간단한 것은 시스템에 있는 XmlDocument/XmlNode/XmlAttribute 클래스와 XmlDocument DOM을 사용합니다.XML 입니다.

XML을 생성해 줍니다. 몇 가지 항목을 연결하면 됩니다.

그러나 더 큰 것에서는 XML serialization을 사용합니다.

간단한 사례를 들어, XmlOutput을 통해 Xml을 구축할 수 있는 유창한 인터페이스를 살펴볼 것을 제안합니다.

XmlOutput은 읽기 쉽고 유지보수 가능한 코드를 사용하여 간단한 Xml을 생성하는 동시에 유효한 Xml을 생성하는 데 좋습니다.원래 게시물에는 몇 가지 훌륭한 예가 있습니다.

위와 같이.

stringbuilder.append()를 사용합니다.

매우 간단하며, 그런 다음 document.load(매개변수로 strinbuilder object)를 수행할 수 있습니다.

pend 매개변수 내에서 string.concat을 사용할 수도 있지만 이는 매우 간단한 접근법입니다.

언급URL : https://stackoverflow.com/questions/284324/how-can-i-build-xml-in-c

반응형