C #에서 XML 파일을 읽고 구문 분석하는 방법


362

C #에서 XML 파일을 읽고 구문 분석하는 방법


2
가장 간단한 해결책은 LINQ to XML을 사용하는 것입니다. 내 예를 참조하십시오.
Konstantin Tarkus

답변:


480

문자열 또는 파일에서 XML을 읽는 XmlDocument

XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");

또는

doc.LoadXml("<xml>something</xml>");

그런 다음 아래에서 노드를 찾으십시오.

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

또는

foreach(XmlNode node in doc.DocumentElement.ChildNodes){
   string text = node.InnerText; //or loop through its children as well
}

그런 다음 해당 노드 내부의 텍스트를 다음과 같이 읽으십시오.

string text = node.InnerText;

또는 속성을 읽습니다

string attr = node.Attributes["theattributename"]?.InnerText

Attributes [ "something"]에서 null이 없는지 항상 확인하십시오. 속성이 없으면 null이됩니다.


1
유효하지만 Linq to XML이 훨씬 좋습니다.
Finglas

3
당신은 그것이 '더 낫다'고 말하지만 LINQ를 통해이 방법을 사용하는 데 다른 단점이 있습니까? 개인적으로 나는이 방법이 적어도 내 요구에 가장 단순하다는 것을 알았습니다.
Kolors

6
LINQ를 사용하기 전에 이것을 작성했습니다. LINQ는 훌륭하고 쉽게 읽을 수 있습니다. 요즘에는 주로 LINQ를 사용합니다. 그러나 일부 구성 요소에는 이전 스타일의 XML 객체가 필요하므로 여전히 사용됩니다. 여기에서 "오래된 스타일"과 LINQ를 모두 사용해보고 자신에게 맞는 것을 확인하는 것이 좋습니다.
Wolf5

1
XmlNode node = XmlDocument.Docu...라인은 진짜로 XmlNode = doc.Docu...? 왜 답변이 변경되고 doc.제거 되었습니까?
wasatchwizard

진실. 왜 내가 바꿨는지 모르겠다 ... 고칠 것이다.
Wolf5

217

LINQ to XML 예 :

// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@"C:\contacts.xml");


// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants("contact")
            where (int)c.Attribute("id") < 4
            select c.Element("firstName").Value + " " +
                   c.Element("lastName").Value;


foreach (string name in query)
{
    Console.WriteLine("Contact's Full Name: {0}", name);
}

참조 : MSDN에서 LINQ to XML


16
XDocument.Parse ( "<xml> 무언가 </ xml>"); 문자열.
Wolf5

2
포함을 포함하지 않는 사람들은 평균, 답변 tho에 감사드립니다 :)
Gabriel Garcia

@GabrielGarcia true, 때로는 초보자가 include의 오류가 누락 될 수 있음
Anonymous

1
관련 내용은 무엇입니까?
sayth

18

xml 사이트 맵을 읽기 위해 작성한 응용 프로그램은 다음과 같습니다.

using System;
using System.Collections.Generic;
using System.Windows.Forms; 
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;

namespace SiteMapReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please Enter the Location of the file");

            // get the location we want to get the sitemaps from 
            string dirLoc = Console.ReadLine();

            // get all the sitemaps 
            string[] sitemaps = Directory.GetFiles(dirLoc);
            StreamWriter sw = new StreamWriter(Application.StartupPath + @"\locs.txt", true);

            // loop through each file 
            foreach (string sitemap in sitemaps)
            {
                try
                {
                    // new xdoc instance 
                    XmlDocument xDoc = new XmlDocument();

                    //load up the xml from the location 
                    xDoc.Load(sitemap);

                    // cycle through each child noed 
                    foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                    {
                        // first node is the url ... have to go to nexted loc node 
                        foreach (XmlNode locNode in node)
                        {
                            // thereare a couple child nodes here so only take data from node named loc 
                            if (locNode.Name == "loc")
                            {
                                // get the content of the loc node 
                                string loc = locNode.InnerText;

                                // write it to the console so you can see its working 
                                Console.WriteLine(loc + Environment.NewLine);

                                // write it to the file 
                                sw.Write(loc + Environment.NewLine);
                            }
                        }
                    }
                }
                catch { }
            }
            Console.WriteLine("All Done :-)"); 
            Console.ReadLine(); 
        }

        static void readSitemap()
        {
        }
    }
}

페이스트 빈 코드 http://pastebin.com/yK7cSNeY


12

몇 가지 방법이 있습니다.

  • XmlSerializer. 읽을 대상 스키마가있는 클래스를 사용하십시오. XmlSerializer를 사용하여 클래스의 인스턴스에로드 된 Xml의 데이터를 가져 오십시오.
  • Linq 2 XML
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (읽기 전용 액세스)

2
실제로 .NET 2.0부터 XmlTextReader를 직접 사용하는 대신 XmlReader.Create가 사용됩니다.
John Saunders


7

Linq에서 XML로.

또한 VB.NET은 C #보다 컴파일러를 통한 XML 구문 분석 지원이 훨씬 우수합니다. 옵션과 욕구가 있다면 확인하십시오.


"모든 잘못된"? 그 진술이 농담이 아니라면 정확하지 않다고 생각합니다. OP는 정보를 제공하지 않았습니다. 그가 작업하는 .NET 버전에 대해.
Cerebrus

1
네 농담 이었지만 재미 있지 않아서 제거했습니다.

7

DataSet을 사용하여 XML 문자열을 읽을 수 있습니다.

var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);

정보를 위해 이것을 게시합니다.


아주 좋은! 그것은 SQL xml 열과 .net에서 정보를 공유하는 것으로 가장 빠른 방법입니다 !!
elle0087

각 수준을 데이터 집합 내의 자체 테이블에 넣는 것처럼 보이는 여러 수준이있는 경우에는 적합하지 않습니다.
Lenny K

그래도 괜찮습니다. 실제로 데이터가 실제로 어떻게 보이는지, 그리고 얼마나 많은 레이어가 데이터를 깊게하는지에 달려 있다고 생각합니다.
user2366842


1
  public void ReadXmlFile()
    {
        string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server.
        XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    break;
                case XmlNodeType.Text:
                    columnNames.Add(reader.Value);
                    break;
                case XmlNodeType.EndElement:
                    break;
            }
        }
    }

첫 번째 문을 피하고 XmlTextReader의 생성자에서 경로 이름을 지정하면됩니다.


0

원하는 곳에 따라 다른 방법이 있습니다. XmlDocument는 XDocument보다 가벼우지만 문자열에 XML이 포함되어 있는지 최소한으로 확인하려면 정규식을 사용하는 것이 가장 빠르고 가벼운 선택 일 수 있습니다. 예를 들어, API에 대해 SpecFlow를 사용하여 Smoke Tests를 구현했으며 유효한 XML로 결과 중 하나가 있는지 테스트하고 싶습니다. 그런 다음 정규식을 사용합니다. 그러나이 XML에서 값을 추출 해야하는 경우 더 빠르고 적은 코드로 XDocument로 구문 분석합니다. 또는 큰 XML로 작업해야하는 경우 XmlDocument를 사용합니다 (때로는 1M 줄 정도의 XML로 작업하는 경우도 있음). 그런 다음 줄 단위로 읽을 수도 있습니다. 왜? Visual Studio에서 개인 바이트로 800MB 이상을 열어보십시오. 프로덕션에서도 2GB보다 큰 객체는 없어야합니다. 당신은 twerk와 함께 할 수 있지만해서는 안됩니다. 많은 행이 포함 된 문서를 구문 분석해야하는 경우이 문서는 아마도 CSV 일 것입니다.

XDocument를 사용하여 예제를 볼 수 있기 때문에이 의견을 작성했습니다. XDocument는 큰 문서 나 콘텐츠가 XML에 유효한지 확인하려는 경우에 좋지 않습니다. XML 자체가 의미가 있는지 확인하려면 스키마가 필요합니다.

나는 또한 그 자체에 위의 정보가 필요하다고 생각하기 때문에 제안 된 대답을 하향 조정했습니다. 시간당 10 회 200M의 XML이 유효한 XML인지 확인해야한다고 상상해보십시오. XDocument는 많은 리소스를 낭비합니다.

prasanna venkatesh는 또한 문자열을 데이터 세트에 채울 수 있다고 말하며 유효한 XML도 나타냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.