C #에서 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 입니다. 그리고이 작업을 수행하는 가장 좋은 방법은 없다고 생각합니다. 항상 스스로 선택해야합니다. 가장 적합한 것입니다.
InnerText
자식 노드의 모든 값과 연결된 해당 노드의 값을 얻습니다. 원하는 이상한 것 같습니다.
InnerText
바로 노드 값을 반환합니다 - 나는 (그리고 다른 아마 모든 사람이 질문을 읽는이) 처음에 찾을 수있는 XML을 구문 분석하고있는 무슨이다.
올바른 XSD 스키마 를 사용하여 xsd.exe 로 클래스 세트를 작성 하고를 사용 XmlSerializer
하여 XML에서 오브젝트 트리를 작성하고 그 반대의 경우도 가능합니다. 모델에 대한 제한이 거의없는 경우 Xml * Attributes를 사용하여 모델 클래스와 XML간에 직접 매핑을 만들 수도 있습니다.
이 XML 직렬화에 대한 소개 기사 MSDN에가.
성능 팁 : 제작 XmlSerializer
비용이 많이 듭니다. XmlSerializer
여러 XML 파일을 구문 분석 / 작성하려는 경우 인스턴스에 대한 참조를 유지하십시오 .
사용 XmlTextReader
, XmlReader
, XmlNodeReader
와 System.Xml.XPath
네임 스페이스. 그리고 ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
일반적 XPath
으로 XML을보다 쉽게 읽을 수 있습니다.
new XmlTextReader()
또는 new XmlTextWriter()
. .NET 2.0 이후에는 더 이상 사용되지 않습니다. XmlReader.Create()
또는 XmlWriter.Create()
대신 사용하십시오 .
나는 최근에 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 파일의 모든 요소와 속성을 전혀 문제없이 구문 분석 할 수있었습니다!
당신이 .NET 2.0을 사용하는 경우, 시도 XmlReader
와 그 서브 클래스 XmlTextReader
, 및 XmlValidatingReader
. XML 파일을 구문 분석 할 수있는 빠르고 가벼운 (메모리 사용 등) 전진 방식을 제공합니다.
XPath
기능 이 필요한 경우를 사용해보십시오 XPathNavigator
. 메모리에 전체 문서가 필요한 경우를 시도하십시오 XmlDocument
.
또한 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을 구문 분석 할 수 있습니다 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는 매우 제한적입니다.
ExtendedXmlSerializer가이 작업을 훨씬 더 많이 수행 할 수 있습니다.
ExtendedXmlSerializer는 .NET 4.5 이상 및 .NET Core를 지원 합니다. WebApi 및 AspCore와 통합 할 수 있습니다.
XmlDocument를 사용하고 Linq에서 XML 클래스로 할 수있는 특성에서 데이터를 조작하거나 검색 할 수 있습니다.