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
, XmlNodeReader
와 System.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
'Programing' 카테고리의 다른 글
Python 3으로 pip를 설치하는 방법은 무엇입니까? (0) | 2020.02.13 |
---|---|
vim에서“다음 찾기” (0) | 2020.02.13 |
컨텐츠를 기반으로 iframe 크기 조정 (0) | 2020.02.13 |
ConcurrentHashMap에 대해 ConcurrentHashSet이없는 이유 (0) | 2020.02.13 |
sizeof (x ++)가 x를 증가시키지 않는 이유 (0) | 2020.02.13 |