C#에서 XML 파일을 읽고 구문 분석하려면 어떻게 해야 합니까?
C#에서 XML 파일을 읽고 구문 분석하려면 어떻게 해야 합니까?
문자열 또는 파일에서 XML을 읽을 수 있는 XmlDocument.
using System.Xml;
XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");
아니면
doc.LoadXml("<xml>something</xml>");
그럼 아래 노드를 찾으세요. 이렇게.
XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");
아니면
foreach(XmlNode node in doc.DocumentElement.ChildNodes){
string text = node.InnerText; //or loop through its children as well
}
그 노드 안의 텍스트를 이렇게 읽습니다.
string text = node.InnerText;
속성을 읽거나
string attr = node.Attributes["theattributename"]?.InnerText
속성이 존재하지 않으면 null이 되므로 ["something"]에서 항상 null을 확인합니다.
LINQ에서 XML로의 예:
// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@"C:\contacts.xml");
// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants("contact")
where (int)c.Attribute("id") < 4
select c.Element("firstName").Value + " " +
c.Element("lastName").Value;
foreach (string name in query)
{
Console.WriteLine("Contact's Full Name: {0}", name);
}
참조: MSDN에서 XML로의 LINQ
다음은 제가 xml 사이트 맵을 읽기 위해 작성한 응용 프로그램입니다.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;
namespace SiteMapReader
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Please Enter the Location of the file");
// get the location we want to get the sitemaps from
string dirLoc = Console.ReadLine();
// get all the sitemaps
string[] sitemaps = Directory.GetFiles(dirLoc);
StreamWriter sw = new StreamWriter(Application.StartupPath + @"\locs.txt", true);
// loop through each file
foreach (string sitemap in sitemaps)
{
try
{
// new xdoc instance
XmlDocument xDoc = new XmlDocument();
//load up the xml from the location
xDoc.Load(sitemap);
// cycle through each child noed
foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
{
// first node is the url ... have to go to nexted loc node
foreach (XmlNode locNode in node)
{
// thereare a couple child nodes here so only take data from node named loc
if (locNode.Name == "loc")
{
// get the content of the loc node
string loc = locNode.InnerText;
// write it to the console so you can see its working
Console.WriteLine(loc + Environment.NewLine);
// write it to the file
sw.Write(loc + Environment.NewLine);
}
}
}
}
catch { }
}
Console.WriteLine("All Done :-)");
Console.ReadLine();
}
static void readSitemap()
{
}
}
}
빈 붙여넣기 코드 http://pastebin.com/yK7cSNeY
여러 가지 방법이 있습니다.
- Xml Serializer.읽을 대상 스키마가 있는 클래스를 사용합니다. XmlSerializer를 사용하여 Xml의 데이터를 클래스 인스턴스로 로드합니다.
- Linq 2 xml
- Xml 텍스트 판독기.
- Xml 문서
- XPath Document(읽기 전용 액세스
데이터셋을 사용하여 XML 문자열을 읽을 수 있습니다.
var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
정보 제공을 위해 이 글을 올립니다.
다음 중 하나를 선택할 수 있습니다.
예제는 제공된 msdn 페이지에 있습니다.
VB도.NET은 C#보다 컴파일러를 통한 xml 구문 분석 지원이 훨씬 뛰어납니다.선택권과 욕구가 있다면 확인해보세요.
예를 들어 XmlTextReader 클래스를 확인합니다.
원하는 장소에 따라 다른 방법이 있습니다.XmlDocument는 XDocument보다 가볍지만 문자열에 XML이 포함되어 있는지 최소한으로 확인하려는 경우 정규식이 가능한 가장 빠르고 가벼운 선택이 될 수 있습니다.예를 들어, API에 대해 SpecFlow를 사용하여 Smoke Tests를 구현했는데 유효한 XML의 결과 중 하나를 테스트하고 정규식을 사용하려고 합니다.그러나 이 XML에서 값을 추출해야 한다면 XDocument로 구문 분석하여 더 빠르고 코드를 적게 사용하고자 합니다.또는 큰 XML로 작업해야 하는 경우 XmlDocument를 사용할 것입니다(그리고 때로는 1M 행 정도인 XML로 작업할 때도 있습니다). 그러면 한 줄씩 읽을 수도 있습니다. 왜 그럴까요?Visual Studio에서 800MB 이상의 개인 바이트를 열어 보십시오. 운영 환경에서도 2GB 이상의 개체가 있으면 안 됩니다.당신은 잘 할 수 있지만, 그렇게 해서는 안됩니다.행이 많이 포함된 문서를 구문 분석해야 하는 경우 이 문서는 CSV일 수 있습니다.
XDocument의 예시를 많이 보기 때문에 이 코멘트를 작성하게 되었습니다.XDocument는 큰 문서나 XML 내용이 유효한지만 확인하려는 경우에는 적합하지 않습니다.XML 자체가 의미가 있는지 확인하려면 Schema가 필요합니다.
저는 또한 제안된 답변에 대해 반대 의견을 내놨는데, 그 이유는 그것 자체가 위의 정보를 필요로 한다고 생각하기 때문입니다.시간당 10번씩 200M의 XML이 유효한지 확인해야 한다고 생각해보세요. XDocument는 많은 자원을 낭비할 것입니다.
prasanna venkatesh는 또한 문자열을 데이터셋에 채우도록 시도할 수 있으며, 이것은 또한 유효한 XML을 나타낼 것입니다.
다음은 코드 라인이 거의 없는 xml 파일을 구문 분석하는 오픈 소스 라이브러리인 Cinchoo ETL을 사용한 또 다른 접근 방식입니다.
using (var r = ChoXmlReader<Item>.LoadText(xml)
.WithXPath("//item")
)
{
foreach (var rec in r)
rec.Print();
}
public class Item
{
public string Name { get; set; }
public string ProtectionLevel { get; set; }
public string Description { get; set; }
}
샘플 fiddle: https://dotnetfiddle.net/otYq5j
면책 사항:저는 이 도서관의 저자입니다.
public void ReadXmlFile()
{
string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server.
XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
break;
case XmlNodeType.Text:
columnNames.Add(reader.Value);
break;
case XmlNodeType.EndElement:
break;
}
}
}
첫 번째 문을 피하고 XmlTextReader의 생성자에서 경로 이름만 지정할 수 있습니다.
XML 파일에서 특정 값을 검색하려는 경우
XmlDocument _LocalInfo_Xml = new XmlDocument();
_LocalInfo_Xml.Load(fileName);
XmlElement _XmlElement;
_XmlElement = _LocalInfo_Xml.GetElementsByTagName("UserId")[0] as XmlElement;
string Value = _XmlElement.InnerText;
언급URL : https://stackoverflow.com/questions/642293/how-do-i-read-and-parse-an-xml-file-in-c
'programing' 카테고리의 다른 글
scanf와 scanf_s의 차이 (0) | 2023.11.02 |
---|---|
MySQL 데이터베이스에 255 char 이상 저장하는 방법? (0) | 2023.11.02 |
특급 JS내의 여만 (0) | 2023.11.02 |
가입 대 WHERE의 Oracle SQL 쿼리 필터 (0) | 2023.11.02 |
ODBC ExecuteNonQuery()가 중단됨 (0) | 2023.11.02 |