programing

C#에서 XML을 처리하는 방법

powerit 2023. 10. 10. 21:14
반응형

C#에서 XML을 처리하는 방법

C# 2.0에서 XML 문서, XSD 등을 처리하는 가장 좋은 방법은 무엇입니까?

어떤 클래스를 사용할지 등.XML 문서를 파싱하고 만드는 가장 좋은 방법은 무엇입니까?

편집: .Net 3.5 제안 또한 환영합니다.

C# 2.0에서 읽고 쓰는 주요 수단은 XmlDocument 클래스를 통해 이루어집니다.대부분의 설정을 XmlReader를 통해 XmlDocument로 직접 로드할 수 있습니다.

XML을 직접 로드하는 중

XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");

파일에서 XML 로드

XmlDocument document = new XmlDocument();
document.Load(@"C:\Path\To\xmldoc.xml");
// Or using an XmlReader/XmlTextReader
XmlReader reader = XmlReader.Create(@"C:\Path\To\xmldoc.xml");
document.Load(reader);

XML 문서를 읽는 가장 쉽고 빠른 방법은 XPath를 사용하는 것입니다.

XPath를 사용하여 XML 문서 읽기(편집이 가능한 XmlDocument 사용)

XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");

// Select a single node
XmlNode node = document.SelectSingleNode("/People/Person[@Name = 'Nick']");

// Select a list of nodes
XmlNodeList nodes = document.SelectNodes("/People/Person");

XML 문서의 유효성을 검사하기 위해 XSD 문서를 사용해야 하는 경우 이 문서를 사용할 수 있습니다.

XSD 스키마에 대한 XML 문서 유효성 검사

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidateType = ValidationType.Schema;
settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd

XmlReader reader = XmlReader.Create(pathToXml, settings);
XmlDocument document = new XmlDocument();

try {
    document.Load(reader);
} catch (XmlSchemaValidationException ex) { Trace.WriteLine(ex.Message); }

각 노드에서 XSD에 대한 XML 유효성 검사(UPDATE 1)

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidateType = ValidationType.Schema;
settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd
settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler);

XmlReader reader = XmlReader.Create(pathToXml, settings);
while (reader.Read()) { }

private void settings_ValidationEventHandler(object sender, ValidationEventArgs args)
{
    // e.Message, e.Severity (warning, error), e.Error
    // or you can access the reader if you have access to it
    // reader.LineNumber, reader.LinePosition.. etc
}

XML 문서 작성(수동)

XmlWriter writer = XmlWriter.Create(pathToOutput);
writer.WriteStartDocument();
writer.WriteStartElement("People");

writer.WriteStartElement("Person");
writer.WriteAttributeString("Name", "Nick");
writer.WriteEndElement();

writer.WriteStartElement("Person");
writer.WriteStartAttribute("Name");
writer.WriteValue("Nick");
writer.WriteEndAttribute();
writer.WriteEndElement();

writer.WriteEndElement();
writer.WriteEndDocument();

writer.Flush();

(업데이트 1)

.NET 3.5에서는 XDocument를 사용하여 유사한 작업을 수행합니다.그러나 다른 점은 필요한 정확한 데이터를 선택하기 위해 Linq 쿼리를 수행할 수 있다는 장점이 있다는 것입니다.개체 이니셜라이저를 추가하면 쿼리 자체에 고유한 정의의 개체도 반환하는 쿼리를 만들 수 있습니다.

    XDocument doc = XDocument.Load(pathToXml);
    List<Person> people = (from xnode in doc.Element("People").Elements("Person")
                       select new Person
                       {
                           Name = xnode.Attribute("Name").Value
                       }).ToList();

(업데이트 2)

들어오는 좋은 방법.NET 3.5는 XML을 만들기 위해 XDocument를 사용하는 것입니다.이렇게 하면 코드가 원하는 출력과 유사한 패턴으로 나타납니다.

XDocument doc =
        new XDocument(
              new XDeclaration("1.0", Encoding.UTF8.HeaderName, String.Empty),
              new XComment("Xml Document"),
              new XElement("catalog",
                    new XElement("book", new XAttribute("id", "bk001"),
                          new XElement("title", "Book Title")
                    )
              )
        );

작성.

<!--Xml Document-->
<catalog>
  <book id="bk001">
    <title>Book Title</title>
  </book>
</catalog>

다른 모든 것은 실패합니다. 제가 여기서 논의한 많은 예시가 있는 이 MSDN 기사를 확인하실 수 있습니다.http://msdn.microsoft.com/en-us/library/aa468556.aspx

크기에 따라 달라지는데, 크기가 작은 xml에서 중간 크기의 xmlDocument(모든 C#/)와 같은 DOM입니다.NET 버전) 또는 XDocument(.)NET 3.5/C# 3.0)이 확실한 승자입니다.xsd를 사용하는 경우 XmlReader를 사용하여 xml을 로드할 수 있으며 XmlReader는 XmlReaderSettings를 허용(Create)합니다.XmlReaderSettings 개체에는 xsd(또는 dtd) 검증을 수행하는 데 사용할 수 있는 Schemas 속성이 있습니다.

xml을 작성할 경우 이전의 xmlDocument보다 LINQ-to-XML(XDocument)로 컨텐츠를 레이아웃하는 것이 조금 더 쉽다는 점에 유의하여 동일한 사항이 적용됩니다.

그러나 거대한 xml의 경우 DOM이 메모리를 너무 많이 잘라낼 수 있으므로, 이 경우 XmlReader/XmlWriter를 직접 사용해야 합니다.

마지막으로 xml을 조작하기 위해 XslCompiledTransform(xslt 레이어)을 사용할 수 있습니다.

xml을 사용하는 대신 객체 모델을 사용하는 방법이 있습니다. xsd를 사용할 수 있습니다.xsd 호환 모델을 나타내는 클래스를 생성하고, 간단히 xxm을 객체로 로드하고, OO로 조작한 다음 다시 해당 객체를 직렬화합니다. XmlSerializer로 이 작업을 수행합니다.

닉톰의 대답은 아주 좋습니다.여기에 몇 가지를 덧붙이고 싶습니다.

XML 에 읽기 권한이 ,XPathDocument입니다보다 훨씬 입니다.XmlDocument.

XPathDocument당신이 익숙한 것을 사용할 수 없다는 것입니다.SelectNodes그리고.SelectSingleNodeXmlNode. 대신에, 당신은 당신이 사용할 수 있는 도구를 사용해야 합니다.IXPathNavigable 사용:eCreateNavigatorXPathNavigator, 합니다.XPathNavigator창조하다, 만들어 내다XPathNodeIteratorXPath를 통해 찾은 노드 목록을 반복합니다. 몇 를 더 로 합니다.XmlDocument방법들.

:XmlDocument그리고.XmlNodetIXPathNavigable 어떤 라도 그 , , XPathDocument입니다에도 입니다.XmlDocument. 만약 당신이 반대 글을 쓰는 것에 익숙해진다면,IXPathNavigable, 당신의 방법들은 어느 하나의 대상에 대해서도 작용할 수 있습니다.(이것이 사용하는 이유입니다.XmlNode그리고.XmlDocument메서드 시그니처는 FxCop에 의해 플래그 지정됩니다.)

도.XDocument그리고.XElement(그리고XNode그리고.XObject를) 구현하지 IXPathNavigable.

XmlReader은 일반적으로 합니다.XmlReader처리를 시작하기 전에 XML 스트림을 개체 모델로 구문 분석하는 오버헤드를 방지합니다.대신에, 당신이 사용합니다.XmlReader입력 스트림을 한 번에 하나의 XML 노드로 처리합니다.이것은 본질적으로.SAX에 대한 NET의 답변.매우 큰 XML 문서를 처리하기 위한 매우 빠른 코드를 작성할 수 있습니다.

XmlReader또한 SQL Server의 FOR XML RAW 옵션이 반환하는 포함 요소가 없는 XML 요소 스트림과 같이 XML 문서 조각을 처리하는 가장 간단한 방법을 제공합니다.

하는 코드는 XmlReader일반적으로 읽고 있는 XML의 형식과 매우 밀접하게 결합되어 있습니다.XPath를 사용하면 XML에 훨씬 더 느슨하게 코드를 연결할 수 있으므로 일반적으로 정답입니다.가 있을 때.XmlReader

우선 새로운 XDocumentXElement 클래스에 대해 알아봅니다. 이전 XmlDocument 제품군보다 개선된 클래스이기 때문입니다.

  1. 그들은 LINQ와 함께 일합니다.
  2. 그들은 더 빠르고 더 가볍습니다.

그러나 레거시 코드(특히 이전에 생성된 프록시)를 사용하려면 이전 클래스를 계속 사용해야 할 수도 있습니다.이 경우 XML 처리 클래스 간의 상호 운용을 위해 몇 가지 패턴을 숙지해야 합니다.

당신의 질문은 꽤 광범위하고, 세부 사항을 설명하기 위해서는 하나의 답변에 너무 많은 것이 필요할 것이라고 생각하지만, 이것이 제가 처음으로 생각한 일반적인 답변이고, 시작이 됩니다.

101개의 Linq

http://msdn.microsoft.com/en-us/library/bb387098.aspx

Link-XML 샘플

http://msdn.microsoft.com/en-us/vbasic/bb688087.aspx

그리고 저는 Linq가 XML을 쉽게 만든다고 생각합니다.

일하시는 분들은.NET 3.5와 실험 코드를 두려워하지 않는다면 생성할 LINQ to XSD(http://blogs.msdn.com/xmlteam/archive/2008/02/21/linq-to-xsd-alpha-0-2.aspx) 를 확인할 수 있습니다.XSD의 NET 클래스(XSD의 기본 제공 규칙 포함).

그런 다음 XSD 규칙을 준수하도록 파일에 바로 쓰고 파일에서 읽을 수 있는 기능을 제공합니다.

사용자가 작업하는 XML 문서에 대해 XSD를 사용할 것을 확실히 제안합니다.

  • XML에서 규칙을 적용할 수 있습니다.
  • 다른 사용자가 XML이 어떻게 구성되어 있는지 확인할 수 있도록 합니다.
  • XML의 유효성 검사에 사용할 수 있습니다.

Liquid XML Studio는 XSD를 생성하는 데 좋은 도구이며 무료입니다!

XmlDocument 클래스로 XML 쓰기

//itemValues is collection of items in Key value pair format
//fileName i name of XML file which to creatd or modified with content
    private void WriteInXMLFile(System.Collections.Generic.Dictionary<string, object> itemValues, string fileName)
    {
        string filePath = "C:\\\\tempXML\\" + fileName + ".xml";
        try
        {

            if (System.IO.File.Exists(filePath))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(filePath);                   

                XmlNode rootNode = doc.SelectSingleNode("Documents");

                XmlNode pageNode = doc.CreateElement("Document");
                rootNode.AppendChild(pageNode);


                foreach (string key in itemValues.Keys)
                {

                    XmlNode attrNode = doc.CreateElement(key);
                    attrNode.InnerText = Convert.ToString(itemValues[key]);
                    pageNode.AppendChild(attrNode);
                    //doc.DocumentElement.AppendChild(attrNode);

                }
                doc.DocumentElement.AppendChild(pageNode);
                doc.Save(filePath);
            }
            else
            {
                XmlDocument doc = new XmlDocument();
                using(System.IO.FileStream fs = System.IO.File.Create(filePath))
                {
                    //Do nothing
                }

                XmlNode rootNode = doc.CreateElement("Documents");
                doc.AppendChild(rootNode);
                doc.Save(filePath);

                doc.Load(filePath);

                XmlNode pageNode = doc.CreateElement("Document");
                rootNode.AppendChild(pageNode);

                foreach (string key in itemValues.Keys)
                {                          
                    XmlNode attrNode = doc.CreateElement(key);                           
                    attrNode.InnerText = Convert.ToString(itemValues[key]);
                    pageNode.AppendChild(attrNode);
                    //doc.DocumentElement.AppendChild(attrNode);

                }
                doc.DocumentElement.AppendChild(pageNode);

                doc.Save(filePath);

            }
        }
        catch (Exception ex)
        {

        }

    }

OutPut look like below
<Dcouments>
    <Document>
        <DocID>01<DocID>
        <PageName>121<PageName>
        <Author>Mr. ABC<Author>
    <Dcoument>
    <Document>
        <DocID>02<DocID>
        <PageName>122<PageName>
        <Author>Mr. PQR<Author>
    <Dcoument>
</Dcouments>

디자이너에 입력된 데이터셋을 만들면 자동으로 강력하게 입력된 개체인 xsd를 얻을 수 있고, 한 줄의 코드로 xml을 로드하고 저장할 수 있습니다.

C# 프로그래머로서 제 개인적인 생각은 C#에서 XML을 처리하는 가장 좋은 방법은 코드의 그 부분을 VB에 위임하는 것입니다.NET 프로젝트..NET 3.5, VB에서.NET에는 XML Literals가 있어 XML을 훨씬 더 직관적으로 처리할 수 있습니다.예를 들어 여기를 참조하십시오.

Visual Basic에서 LINQ to XML의 개요

(C#코드가 아닌 VB코드가 표시되도록 페이지를 설정해야 합니다.)

나머지 프로젝트는 C#로 작성하되 XML은 참조된 VB 프로젝트에서 처리합니다.

닉스톰,

예제 1에서 "doc"과 "xdoc"이 일치해야 하지 않습니까?

XDocument **doc** = XDocument.Load(pathToXml);
List<Person> people = (from xnode in **xdoc**.Element("People").Elements("Person")
                   select new Person
                   {
                       Name = xnode.Attribute("Name").Value
                   }).ToList();

쿠키의 대답은 좋군요...그러나 XSD(또는 XML)에서 강력하게 입력된 개체를 생성하고 몇 줄의 코드로 직렬화/병렬화하는 방법에 대한 자세한 지침은 다음과 같습니다.

지침들

를 에 변환해야 XmlNode<=>XNode<=>XElement
이 이 될 수 예: LINQ해) 확장명다.

public static class MyExtensions
{
    public static XNode GetXNode(this XmlNode node)
    {
        return GetXElement(node);
    }

    public static XElement GetXElement(this XmlNode node)
    {
        XDocument xDoc = new XDocument();
        using (XmlWriter xmlWriter = xDoc.CreateWriter())
            node.WriteTo(xmlWriter);
        return xDoc.Root;
    }

    public static XmlNode GetXmlNode(this XElement element)
    {
        using (XmlReader xmlReader = element.CreateReader())
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(xmlReader);
            return xmlDoc;
        }
    }

    public static XmlNode GetXmlNode(this XNode node)
    {
        return GetXmlNode(node);
    }
}

용도:

XmlDocument MyXmlDocument = new XmlDocument();
MyXmlDocument.Load("MyXml.xml");
XElement MyXElement = MyXmlDocument.GetXElement(); // Convert XmlNode to XElement
List<XElement> List = MyXElement.Document
   .Descendants()
   .ToList(); // Now you can use LINQ
...

언급URL : https://stackoverflow.com/questions/220867/how-to-deal-with-xml-in-c-sharp

반응형