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
. 이것은 더 원시적이지만 (한 번만 쓰는 firehose) 매우 효율적입니다 (여기에서 큰 루프를 상상하십시오).
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
는 불변 유형을 직렬화하는 것을 좋아하지 않는다는 것입니다. 모든 것이 공개 getter 및 setter를 가져야합니다 (구현하여 직접 모든 작업을 수행하지 않는 한 IXmlSerializable
,을 사용하여 많이 얻지 못했습니다 XmlSerializer
).
내가 시도한 가장 좋은 점은 LINQ to XSD입니다 (대부분의 개발자에게는 알려지지 않음). XSD 스키마를 제공하고 백그라운드에서 완벽하게 매핑 된 강력한 형식의 객체 모델 (LINQ to 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
또한 LINQ에서 XML로 XElement 형식의 요소를 생성합니다.
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 스키마 정의 도구는 하나의 예입니다
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
이 리소스는 적당한 XML 저장 /로드 : C #을 사용하여 XML 읽기 / 쓰기에 충분해야한다고 생각합니다 .
내 임무는 음악 표기법을 저장하는 것이 었습니다. .NET 이 작업을 쉽게 해결할 수있을 정도로 성숙해 졌기 때문에 XML을 선택합니다 . 내가 맞았 어 :)
이것은 내 노래 파일 프로토 타입입니다.
<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);
}
}
}
}
}
간단한 것을 위해 System.XML에있는 XmlDocument / XmlNode / XmlAttribute 클래스와 XmlDocument DOM을 사용합니다.
XML을 생성하므로 몇 가지 항목을 함께 연결하면됩니다.
그러나 더 큰 것은 XML 직렬화를 사용하는 것입니다.
간단한 경우에는 XmlOutput을 Xml 빌드를위한 유창한 인터페이스로 보는 것이 좋습니다 .
XmlOutput은 유효한 Xml을 생성하면서 읽을 수 있고 유지 관리 가능한 코드로 간단한 Xml을 만드는 데 유용합니다. 의 orginal 포스트는 훌륭한 예제가 있습니다.
위와 같이.
stringbuilder.append ()를 사용합니다.
매우 간단하며 xmldocument.load (strinbuilder 객체를 매개 변수로) 할 수 있습니다.
append 매개 변수 내에서 string.concat을 사용하는 것을 알 수 있지만 이것은 매우 간단한 접근 방식입니다.
참고 URL : https://stackoverflow.com/questions/284324/how-can-i-build-xml-in-c
'Programming' 카테고리의 다른 글
OSX에서 JAVA_HOME을 무엇으로 설정해야합니까? (0) | 2020.02.18 |
---|---|
URL 쿼리 매개 변수가 포함 된 HTTP POST-좋은 아이디어입니까? (0) | 2020.02.18 |
Android 기본 사항 : UI 스레드에서 코드 실행 (0) | 2020.02.18 |
Map을 구현하고 삽입 순서를 유지하는 Java 클래스? (0) | 2020.02.18 |
JavaScript를 최소화 / 압축 해제하는 도구 (0) | 2020.02.18 |