Programming/.NET

 1. XPathDocument

 

XmlDocument는 닷넷 버전 1.1때부터 XML을 파싱하는데 주로 사용되어온 일반적인 클래스입니다. 하지만 이 클래스는 읽어들인 전체XML을 메모리에 로드하고 파싱하므로 성능상에 특히, 메모리관리상에 문제점이 존재합니다. 이를 보완하고자 등장한 것이 XPathDocument인데 이 클래스는 대규모 XML검색을 용이하게 하고 공백이나 CDATA같은 데이터를 버리므로서 좀더 간략한 데이터를 다룰 수 있도록 합니다.

 

또한 XPathDocument클래스는 이전에 사용한 XmlReader클래스와는 동작방식이 다릅니다. 정방향 읽기전용으로 데이터를 순회하는것과는 달리 XPath식을 사용한 임의의 데이터 엑세스를 지원하기에 XML데이터를 자유롭게 이동할 수 있습니다.

 

다만 하위호환성을 유지해야 하거나 혹은 특정 XML에 대해 쓰기동작을 구현하려면 여전히 XmlDocument클래스를 사용해야 합니다. XPathDocument는 XML을 읽는데 있어서 XmlDocument와는 확실히 성능상 이익을 가져다 주지만 이것은 읽기전용으로 동작한다는 점을 명심해야 합니다. 다시 말해 읽기만 할뿐 XML을 수정하거나 작성할 수 없습니다.

 

따라서 XML내부에 특정 데이터를 찾거나 단순히 값을 가져오는 경우, 즉 수정이 필요없는 경우 라면 우선적으로 XPathDocument클래스를 사용하도록 합니다.

 

string xml_file = Server.MapPath("books.xml");

XPathDocument xpd = new XPathDocument(xml_file);
XPathNavigator nav = xpd.CreateNavigator();

foreach (XPathNavigator node in nav.Select("//book[genre='Computer']/title"))
    Response.Write(node.Value + "<br />");

 

XPathDocument클래스로 XML문서를 로드한후 CreateNavigator메소드로 XPathNavigator개체를 반환하도록 합니다. 그러면 이 개체를 통해 실질적으로 XML에 대한 질의를 수행하게 되는데 예제에서는 book을 최상위루트로 하고 하위에 genre요소의 값이 Computer(대소문자롤 구분합니다.)인것을 찾아 title요소값을 가져오도록 하였습니다.

 

XPath에 관해서는 다음 링크를 참고해 주십시오.

 

http://www.w3schools.com/xsl/xpath_intro.asp

 

만약 XmlDocument 클래스를 통해 XML수정이 필요한 경우라면

 

XmlDocument xd = new XmlDocument();
xd.Load(xml_file);
XPathNavigator nav = xd.CreateNavigator();

foreach (XPathNavigator node in nav.Select("//book[genre='Computer']/title")) {
    node.SetValue("제곧내");
    Response.Write(node.Value + "<br />");
}

 

XPathDocument대신 XmlDocument클래스를 사용하면 됩니다. foreach안에서 검색된 노드에 대해 SetValue메소드로 값을 수정하고 있는데 이렇게 하면 메모리상에 로드된 XML데이터가 변경됩니다. 다만 실제 XML파일이 바뀌는 것이 아니므로 물리적 파일로 XML수정내용이 적용되어야 한다면 파일로 다시 저장하도록 해야 합니다.

 

필요한 경우 네임스페이스 접두사를 사용할 수도 있는데 그런 경우에는 XmlNamespaceManager클래스를 사용합니다.

 

XmlNamespaceManager xnm = new XmlNamespaceManager(nav.NameTable);
xnm.AddNamespace("x""http://book.com/");

foreach (XPathNavigator node in nav.Select("//x:book[x:genre='Computer']/x:title", xnm)) {
    Response.Write(node.Value + "<br />");
}

 

XmlNamespaceManager클래스를 통해 x접두사로 네임스페이스를 추가하였으며 XPath식에 접두사를 붙이고 Select 인자에 XmlNamespaceManager개체를 전달하면 됩니다.

 

 2. Linq와 XPath

 

XML노드 데이터를 검색하는데 Linq형식을 구현하려면 언제나 그렇듯 XDocument클래스를 통해 XML파일을 로드해야 합니다.

 

string xml_file = Server.MapPath("books.xml");

XDocument x = XDocument.Load(xml_file);

var nodes = x.XPathSelectElements("//book[genre='Computer']/title");
foreach (XElement node in nodes)
    Response.Write(node.Value + "<br />");

 

XDocument개체에서 XPathSelectElements메소드로 XPath를 구현해 원하는 요소를 검색합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] DataList  (0) 2016.03.03
[ASP.NET] XML - 6  (0) 2016.02.23
[ASP.NET] XML - 5  (0) 2016.02.18
[ASP.NET] XML - 4  (0) 2016.02.11
[ASP.NET] XML - 3  (0) 2016.02.01
[ASP.NET] XML - 2  (0) 2016.01.26
0 0