2009-10-22 2 views
1

나는구문 분석 XML은

<Data> 
    <MaxCount>10</MaxCount> 
    <Points> 
    <Point X="10" Y="10"/> 
    <Point X="20" Y="10"/> 
    <Point X="30" Y="10"/> 
    <Point X="40" Y="10"/> 
    <Point X="50" Y="10"/> 
    <Point X="60" Y="10"/> 
    </Points> 
</Data> 

은 기본적으로 내가 (내 포인트 개체가이 속성 X을 가지고 있으며, Y Point 객체의 배열로 모든 소수점 값을 읽을 수 다음 XML을 읽을 수있는 방법을 찾고 있어요) 및 MaxCount를 정수로 변환합니다. C#을 사용하여 XML 파일에서 Point 값을 추출하는 가장 좋은 방법은 무엇입니까?

감사합니다.

답변

1

는 :

public void CreatePoints(string xml) 
{ 
    XPathDocument doc = new XPathDocument(XmlReader.Create(new StringReader(xml))); 
    var xPathNodeIterator = doc.CreateNavigator().Select("/Data/Points/Point"); 
    foreach (XPathNavigator node in xPathNodeIterator) 
    { 
     var x = node.SelectSingleNode("@X").ValueAsInt; 
     var y = node.SelectSingleNode("@Y").ValueAsInt; 

     new Point(x, y); 
    } 
} 
+0

doc.LoadXml (xml)로 XML을 읽을 수 있습니다. doc variabe에서 doc.DocumentElement.SelectNodes ("Data/Points/*")를 호출하고 각 XmlNode를 반복 할 수 있습니다. –

+0

@Patrick : XMLDocument는 XPathDocument와 비교할 때 매우 무거운 가중치 개체입니다. XPathDocument를 사용하는 것은 약간 번거롭지 만 XMLDocumentet보다 성능이 훨씬 좋습니다. – rauts

4

음, XMLDocument 클래스를 사용하여 파일을 쉽게 읽을 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

은 기본적으로 당신은 단지 그것을 작성하는 된 XMLNodes을 통해 파일에 읽기 클래스 다음 다음 사이클이있을 것이다. 노드의 innerText 속성을 사용하여 MaxCount를 읽고 자식 노드를 순환하고 XMLNode의 attribute 속성을 통해 필요한 데이터를 가져옵니다. 그것은 XPath를 사용하여 수행 할 수 있습니다

+0

대신 LINQ-to-XML 클래스 (XDocument)를 사용하는 것이 좋습니다. –

4
class Point 
    { 
     public int X { get; set; } 
     public int Y { get; set; } 
    } 

    static int Main(string[] args) 
    { 
     string xml = "<Data> <MaxCount>10</MaxCount> <Points> <Point X=\"10\" Y=\"10\"/> <Point X=\"20\" Y=\"10\"/> <Point X=\"30\" Y=\"10\"/> <Point X=\"40\" Y=\"10\"/> <Point X=\"50\" Y=\"10\"/> <Point X=\"60\" Y=\"10\"/> </Points></Data>"; 

     XDocument doc = XDocument.Parse(xml); 

     int maxCount = int.Parse(doc.Element("Data").Element("MaxCount").Value); 

     var points = from e in doc.Element("Data").Element("Points").Elements("Point") 
        select new Point 
        { 
         X = int.Parse(e.Attribute("X").Value), 
         Y = int.Parse(e.Attribute("Y").Value) 
        }; 

     Console.WriteLine("MaxCount: {0}", maxCount); 
     foreach (var item in points) 
     { 
      Console.WriteLine("Point: {0},{1}", item.X, item.Y); 
     } 
    } 
+0

linq to xml은이 도구를위한 훌륭한 도구입니다 – chester89

8

난 당신이 XmlSerializer 클래스를 살펴 보시기 바랍니다. XML을 객체에 직접 직렬화 및 비 직렬화 할 수 있습니다.

[XmlRoot(Namespace = "")] 
public class Data 
{ 
    public int MaxCount; 
    public Point[] Points; 
} 

public class Point 
{ 
    [XmlAttribute] 
    public int X; 
    [XmlAttribute] 
    public int Y; 
} 

그런 다음 당신은 XmlSerializer를 사용합니다 :

첫째, 클래스는 데이터를 표현하기

Stream s = ... // Some code to open you file into a stream 

var serializer = new XmlSerializer(typeof(Data)); 
Data d = (Data)serializer.Deserialize(s); 

기사 : http://msdn.microsoft.com/en-us/library/ms950721.aspx

+1

보너스를 받으려면 xsd.exe를 사용하여이 클래스를 자동으로 생성 할 수 있습니다. http://msdn.microsoft.com/en-us/library/x6c1kb0s%28VS.71%29.aspx – Lee

+0

@Lee : 위대한 팁. 나는 그것에 대해 잊어 버렸다. (잠시 동안 그것을 사용하지 않았 ...) –

0

클래스 데이터의 MaxCount와 정수 속성과 하나 만들기 property List 유형의 포인트 (Point는 X 및 Y 속성이있는 다른 클래스)입니다. 이러한 클래스를 Serializable로 표시하십시오.

XMLReader에 XML을로드하십시오.

XmlDiserize the Xmlreader를 Data 클래스에 사용.

실례를 제공하지 않아서 죄송합니다.

+0

여기에 과도 함 생각합니다. 이 간단한 시나리오에서는 XPath를 사용하십시오. –

+0

@Patrick : 과용하지 마세요 ;-) 이미 채우려는 포인트 클래스가 있습니다. 가독성/복잡성 및 코드의 양을 위의 내 대답을 참조하십시오 ... –