PC&웹/VS프로그래밍

C#, XML 조각 파일 읽기 - 멀티 루트

Simulz™ 2023. 10. 17. 13:04
반응형

XML 문서가 아니더라도 태그와 속성을 사용한 설정 파일을 많이 사용한다.

XML 파일을 읽는 두 가지 방법

1. XmlReader

private void btLoad_Click(object sender, EventArgs e)
{
    richTextBox1.Text = "";

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ConformanceLevel = ConformanceLevel.Fragment;

    using (XmlReader reader = XmlReader.Create(File, settings))
    {
        textEdit_file.EditValue = File;

        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.XmlDeclaration)
            {
                reader.Skip();
                continue;
            }
            XNode node = XNode.ReadFrom(reader);

            richTextBox1.Text += node.GetOuterXml();
        }
        reader.Close();
    }
}

XmlReader 클래스는 XmlReaderSettings 설정을 사용하면 XML 조각 파일을 읽을 수 있다.

 

2. XmlDocument

XmlDocument 클래스는 루트가 두 개 이상 존재하면 오류가 발생한다.
방법은 전체 코드를 읽어서 루트 코드로 감싼다.

private void loadXDoc_Click(object sender, EventArgs e)
{
    richTextBox1.Text = "";

    string buff = System.IO.File.ReadAllText(File);

    XmlDocument doc = new XmlDocument();
    doc.LoadXml("<root>" + buff + "</root>");

    XmlNode node = doc.DocumentElement.SelectSingleNode("//root");

    richTextBox1.Text = node.InnerXml;
}

 

그 다음 XML 태그, 속성, 값을 편집 후 XmlWriter를 하면 된다.

XmlWriter

private void UpdateXML(Stream inStream, Stream outStream)
{
    var rsettings = new XmlReaderSettings();
    rsettings.ConformanceLevel = ConformanceLevel.Fragment;

    var wsettings = new XmlWriterSettings()
    {
        ConformanceLevel = ConformanceLevel.Fragment,
        Indent = true,
        IndentChars = "\t"
    };

    using (var reader = XmlReader.Create(inStream, rsettings))
    {
        using (var writer = XmlWriter.Create(outStream, wsettings))
        {
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        writer.WriteStartElement(reader.Prefix, reader.Name, reader.NamespaceURI);
                        writer.WriteAttributes(reader, true);

                        if (reader.IsEmptyElement)
                        {
                            writer.WriteEndElement();
                        }
                        break;

                    case XmlNodeType.Text:
                        writer.WriteString(reader.Value);
                        break;

                    case XmlNodeType.EndElement:
                        writer.WriteFullEndElement();
                        break;

                    case XmlNodeType.XmlDeclaration:
                    case XmlNodeType.ProcessingInstruction:
                        writer.WriteProcessingInstruction(reader.Name, reader.Value);
                        break;
                }
            }
        }
    }
}
반응형