XML 파일을 어떻게 구문 분석합니까? [닫은]


492

C #에서 XML 파일을 구문 분석하는 간단한 방법이 있습니까? 그렇다면 무엇입니까?


이 구현을 사용할 수 있습니다 : stackoverflow.com/a/34813985/5784646
Eulogy

좋아, 나는 이것을 다시 열었다. 복제본은 XML 파일 구문 분석에 관한 XML Reader 솔루션이었습니다. posssible 중복이 질문의에서 볼 수있는 편집 역사 추신 @GeorgeStocker
제레미 톰슨

1
@JeremyThompson 이것이 중복 된 이유 중 하나는 다른 질문에 훨씬 더 나은 답변이 있기 때문입니다. 간단한 "링크 만"답변 인 최상위 답변은 유용하지 않습니다.
George Stocker

1
@GeorgeStocker 질문은 공존하기에 충분히 다르고 두 가지 모두 훌륭한 답변을 제공하며 허용 되는 질문은 다른 기술을 사용하고 있습니다. 나는 희망 재개의 부작용은 약간까지 존 응원, 우리는 나는이 허용 한 경우에만 링크를 알고,이 개방두고 있지만 MSDN과 그 수용 할 수없는 전에 한 번에 기록 된 투표 이유는 그 자신의 프로필을 읽어 . 어쨌든 건배.
Jeremy Thompson

답변:



314

매우 간단합니다. 나는 이것이 표준 방법이라는 것을 알고 있지만 훨씬 더 잘 처리하기 위해 자신의 라이브러리를 만들 수 있습니다.

여기 몇 가지 예가 있어요.

XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file

// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge"); 
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");

// Display the results
Console.WriteLine("Address: " + girlAddress[0].InnerText);
Console.WriteLine("Age: " + girlAge[0].InnerText);
Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText);

또한 다른 방법 으로 작업 할 수 있습니다. 예를 들어 here 입니다. 그리고이 작업을 수행하는 가장 좋은 방법은 없다고 생각합니다. 항상 스스로 선택해야합니다. 가장 적합한 것입니다.


47
XmlDocument를 언급하면 ​​+1이며, 일부 경우 직렬화 인터페이스보다 훨씬 편리합니다. 하나의 특정 요소 뒤에있는 경우 xmlDoc [ "Root"] 인덱서를 사용하여 하위 요소에 액세스 할 수 있으며 xmlDoc [ "Root"] [ "Folder"] [ "Item"]을 체인으로 묶을 수 있습니다. 계층 구조 (이러한 요소가 실제로 존재하는지 확인하는 것이 합리적이지만)
Jason Williams

1
InnerText자식 노드의 모든 값과 연결된 해당 노드의 값을 얻습니다. 원하는 이상한 것 같습니다.
Don Cheadle

17
여자 친구 목록이있는 프로그래머? 셰 나니 건!
E. van Putten

1
요즘은 아니 고요. 이것은 멍청이 들아의 복수 아니다
user4052054

당신은 거기에 기대하지 않는 경우 @DonCheadle가 자식 노드 후 InnerText바로 노드 값을 반환합니다 - 나는 (그리고 다른 아마 모든 사람이 질문을 읽는이) 처음에 찾을 수있는 XML을 구문 분석하고있는 무슨이다.
F1Krazy

48

올바른 XSD 스키마 를 사용하여 xsd.exe 로 클래스 세트를 작성 하고를 사용 XmlSerializer하여 XML에서 오브젝트 트리를 작성하고 그 반대의 경우도 가능합니다. 모델에 대한 제한이 거의없는 경우 Xml * Attributes를 사용하여 모델 클래스와 XML간에 직접 매핑을 만들 수도 있습니다.

XML 직렬화에 대한 소개 기사 MSDN에가.

성능 팁 : 제작 XmlSerializer비용이 많이 듭니다. XmlSerializer여러 XML 파일을 구문 분석 / 작성하려는 경우 인스턴스에 대한 참조를 유지하십시오 .



5
좋은 예는 Microsoft의이 예 중간에있는 "구매 주문 예"입니다. msdn.microsoft.com/en-us/library/58a18dwa.aspx . 스키마를 작성하지 않아도됩니다. C # 클래스는 C # 속성으로 장식 된 스키마입니다.
Mark Lakata

25

많은 양의 데이터 (많은 메가 바이트)를 처리하는 XmlReader경우 XML을 구문 분석하는 데 사용 하려고합니다.

(다른 건 XPathNavigator, XElement, XmlDocument도 및 XmlSerializer당신이 전체 생성 된 개체 그래프를 유지하는 경우)가 발생합니다 메모리 사용 도 매우 느린로드 시간을합니다.

물론 메모리에 모든 데이터가 필요하다면 선택의 여지가 없을 수 있습니다.


18

사용 XmlTextReader, XmlReader, XmlNodeReaderSystem.Xml.XPath네임 스페이스. 그리고 ( XPathNavigator, XPathDocument, XPathExpression, XPathnodeIterator).

일반적 XPath으로 XML을보다 쉽게 ​​읽을 수 있습니다.


2
참고로, 당신은 사용하지 말아야 new XmlTextReader()또는 new XmlTextWriter(). .NET 2.0 이후에는 더 이상 사용되지 않습니다. XmlReader.Create()또는 XmlWriter.Create()대신 사용하십시오 .
John Saunders

10

나는 최근에 XML 문서의 구문 분석과 관련된 응용 프로그램을 작성해야했으며 LINQ to XML 기반 접근 방식이 최고라고 Jon Galloway에 동의합니다. 그러나 유용한 예제를 찾기 위해 조금 파야 했으므로 더 이상 고민하지 않고 여기에 몇 가지가 있습니다!

이 코드가 작동함에 따라 모든 의견을 환영하지만 완벽하지 않을 수 있으며이 프로젝트의 XML 구문 분석에 대해 자세히 알고 싶습니다!

public void ParseXML(string filePath)  
{  
    // create document instance using XML file path
    XDocument doc = XDocument.Load(filePath);

    // get the namespace to that within of the XML (xmlns="...")
    XElement root = doc.Root;
    XNamespace ns = root.GetDefaultNamespace();

    // obtain a list of elements with specific tag
    IEnumerable<XElement> elements = from c in doc.Descendants(ns + "exampleTagName") select c;

    // obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc
    XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();

    // obtain an element from within an element, same as from doc
    XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();

    // obtain an attribute from an element
    XAttribute attribute = element.Attribute("exampleAttributeName");
}

이 함수를 사용하면 XML 파일의 모든 요소와 속성을 전혀 문제없이 구문 분석 할 수있었습니다!


8

당신이 .NET 2.0을 사용하는 경우, 시도 XmlReader와 그 서브 클래스 XmlTextReader, 및 XmlValidatingReader. XML 파일을 구문 분석 할 수있는 빠르고 가벼운 (메모리 사용 등) 전진 방식을 제공합니다.

XPath기능 이 필요한 경우를 사용해보십시오 XPathNavigator. 메모리에 전체 문서가 필요한 경우를 시도하십시오 XmlDocument.


7

또한 XPath 선택기를 다음과 같은 방식으로 사용할 수 있습니다 (특정 노드를 선택하는 쉬운 방법).

XmlDocument doc = new XmlDocument();
doc.Load("test.xml");

var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with attribute title with value 'Barry Poter'

// Retrieve your data here or change XML here:
foreach (XmlNode book in nodeList)
{
  book.InnerText="The story began as it was...";
}

Console.WriteLine("Display XML:");
doc.Save(Console.Out);

문서


6

"XML 구문 분석을위한 모범 사례"가 있는지 확실하지 않습니다. 다양한 상황에 적합한 수많은 기술이 있습니다. 사용 방법은 구체적인 시나리오에 따라 다릅니다.

당신은 함께 갈 수있는 XML에 LINQ , XmlReader, XPathNavigator또는 정규 표현식. 당신이 당신의 요구를 정교하게한다면, 나는 몇 가지 제안을 할 수 있습니다.


3
XML 정규식. 당신은 괴물.
것이다

3

이 라이브러리를 사용하여 XML을 구문 분석 할 수 있습니다 System.Xml.Linq. 아래는 XML 파일을 구문 분석하는 데 사용한 샘플 코드입니다.

public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
    string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);

    XDocument xDoc = XDocument.Load(path);

    XElement xElement = XElement.Parse(xDoc.ToString());


    List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
    {
        Code = Convert.ToString(d.Element("CategoryCode").Value),
        CategoryPath = d.Element("CategoryPath").Value,
        Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
        SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
    }).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();

    CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);

    return catSubCatList;
}

1

ExtendedXmlSerializer 를 사용 하여 직렬화 및 역 직렬화를 수행 할 수 있습니다 .

설치 nuget 에서 ExtendedXmlSerializer를 설치 하거나 다음 명령을 실행할 수 있습니다 .

Install-Package ExtendedXmlSerializer

직렬화 :

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);

역 직렬화

var obj2 = serializer.Deserialize<Message>(xml);

.NET의 표준 XML Serializer는 매우 제한적입니다.

  • 순환 참조가있는 클래스 또는 인터페이스 속성이있는 클래스의 직렬화를 지원하지 않습니다.
  • 사전을 지원하지 않습니다.
  • 이전 버전의 XML을 읽는 메커니즘은 없습니다.
  • 사용자 정의 serializer를 만들려면 클래스가 IXmlSerializable에서 상속해야합니다. 이것은 수업이 POCO 수업이 아니라는 것을 의미합니다.
  • IoC를 지원하지 않습니다.

ExtendedXmlSerializer가이 작업을 훨씬 더 많이 수행 할 수 있습니다.

ExtendedXmlSerializer는 .NET 4.5 이상 및 .NET Core를 지원 합니다. WebApi 및 AspCore와 통합 할 수 있습니다.


1

XmlDocument를 사용하고 Linq에서 XML 클래스로 할 수있는 특성에서 데이터를 조작하거나 검색 할 수 있습니다.

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