source

XML 파일을 어떻게 구문 분석합니까?

manycodes 2023. 11. 2. 21:55
반응형

XML 파일을 어떻게 구문 분석합니까?

C#에서 XML 파일을 파싱하는 간단한 방법이 있습니까?만약 그렇다면, 뭐?

아주 간단해요.이것들이 일반적인 방법이라는 것을 알지만, 당신은 당신만의 라이브러리를 만들어 훨씬 더 잘 다룰 수 있습니다.

다음은 몇 가지 예입니다.

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);

또한, 작업할 수 있는 다른 방법들도 있습니다.예를 들면 여기.그리고 이것을 할 수 있는 가장 좋은 방법은 없다고 생각합니다. 항상 자신에게 가장 적합한 것을 스스로 선택해야 합니다.

당신이 있다면 XML에 LINQ를 사용하겠습니다.NET 3.5 이상.

양호한 XSD 스키마를 사용하여 xsd.exe로 클래스 집합을 생성하고 XML로 개체 트리를 생성하거나 그 반대의 경우도 마찬가지입니다.모델에 제한이 거의 없는 경우 Xml*Attribute를 사용하여 모델 클래스와 XML 간에 직접 매핑을 만들 수도 있습니다.

MSDN의 XML 직렬화에 대한 소개 기사가 있습니다.

성능 팁:구성하기XmlSerializer값이 비쌉니다.참조를 유지합니다.XmlSerializer여러 XML 파일을 구문 분석/쓰기하려는 경우.

많은 양의 데이터(수 메가바이트)를 처리하는 경우에는XmlReaderXML을 스트림 구문 분석합니다.

기타(XPathNavigator,XElement,XmlDocument심지어는XmlSerializer전체 생성 개체 그래프)를 유지하면 메모리 사용량이 높고 로드 시간도 매우 느립니다.

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

, 및 네임스페이스를 사용합니다.그리고(,XPathNavigator , , ).

일반적으로 XML을 더 쉽게 읽을 수 있으므로 원하는 것을 찾을 수 있는 것입니다.

저는 최근에 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 파일에서 어떤 요소와 속성을 해석해도 문제가 없습니다!

또한 다음과 같은 방법으로 XPath Selector(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);

서류, 서류

사용하시는 분들은.NET 2.0 시도XmlReader그리고 그 하위 계급들.XmlTextReader,그리고.XmlValidatingReader. XML 파일을 구문 분석하는 빠르고 가벼운(메모리 사용량 등) 순방향 전용 방법을 제공합니다.

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

"XML 구문 분석 모범 사례"가 존재하는지 잘 모르겠습니다.다양한 상황에 적합한 수많은 기술이 있습니다.어떤 방법을 사용할지는 구체적인 시나리오에 따라 달라집니다.

LINQ to XML, 또는 정규식을 사용할 수도 있습니다.당신의 요구를 구체적으로 설명해 주신다면, 저는 몇 가지 제안을 해 드릴 수 있습니다.

이 라이브러리를 사용하여 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;
}

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

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

Install-Package ExtendedXmlSerializer

직렬화:

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

역직렬화

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

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

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

ExtendedXmlSerializer는 이 작업 외에도 더 많은 작업을 수행할 수 있습니다.

확장 XmlSerializer 지원.NET 4.5 이상 및 .NET Core.WebApi 및 AspCore와 통합할 수 있습니다.

XmlDocument를 사용할 수 있으며 특성에서 데이터를 조작하거나 검색하기 위해 XML 클래스에 연결할 수 있습니다.

언급URL : https://stackoverflow.com/questions/55828/how-does-one-parse-xml-files

반응형