Programing

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

lottogame 2020. 2. 13. 00:26
반응형

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


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


내가 사용하는 거라고 XML에 LINQ를 사용하면 .NET 3.5 이상에 있다면.


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

여기 몇 가지 예가 있어요.

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 입니다. 그리고 나는 이것을하는 가장 좋은 방법이 없다고 생각합니다. 항상 스스로 선택해야합니다. 가장 적합한 것입니다.


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

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

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


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

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

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


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

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


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

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


나는 최근에 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 선택기를 다음과 같은 방식으로 사용할 수 있습니다 (특정 노드를 선택하는 쉬운 방법).

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

문서


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

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


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

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와 통합 할 수 있습니다.


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

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



반응형