2012-11-06 2 views
1

이 구조의 XML 파일이 있습니다. 노드 "설정"은 한 번만 반복됩니다. "미리 알림"노드는 + 1 번 나타날 수 있습니다.C#을 사용하여 파일에서 XML 파일 읽기

<?xml version="1.0" encoding="utf-8"?> 
<!--Name App--> 
<AllSettings> 
    <Settings> 
    <tax1>21</tax1> 
    <tax2>0</tax2>  
    </Settings> 
    <Reminders> 
    <Name>s8</Name> 
    <Title>xxxxx</Title> 
    <Content>xxxxxxxxx</Content> 
    <BeginTime>09/11/2012 10:00:00</BeginTime> 
    </Reminders> 
    <Reminders> 
    <Name>s2</Name> 
    <Title>zzzzzzzzz</Title> 
    <Content>zzzzzzzzzzz</Content> 
    <BeginTime>07/11/2012 13:00:00</BeginTime>  
    </Reminders> 
</AllSettings> 

하단 코드를 사용하여 "설정"노드에서 데이터를 읽을 수 있습니다. 그러나 각 노드의 "미리 알림"에서 데이터를 읽는 방법은 무엇입니까?

IsolatedStorageFileStream isoFileStream = myIsolatedStorage.OpenFile(myXmlFile, FileMode.Open); 
isoFileStream.Position = 0; 
XmlReader xmlReader; 
xmlReader = XmlReader.Create(isoFileStream);           
xmlReader.MoveToContent(); 

while (xmlReader.Read()) 
{  

    if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Settings" 
    { 
    while (xmlReader.NodeType != XmlNodeType.EndElement) 
    { 
      xmlReader.Read(); 

      if (xmlReader.Name == "tax1") 
      { 
       _tax1 = xmlReader.ReadElementContentAsString(); 
      } 
      else if (xmlReader.Name == "tax2") 
      { 
       _tax2 = xmlReader.ReadElementContentAsString(); 
      } 

     } // end while 
    } 
    else if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Reminders") 
    { 
     // ????    
    } 

} // end while 
+0

미리 알림 요소의 끝 부분을 칠 때까지 내부 루프를 읽습니다. – mbeckish

답변

1

로드를하다 및 LINQ를 사용하여 쿼리 XML.

var isoFileStream = myIsolatedStorage.OpenFile(myXmlFile, FileMode.Open); 
isoFileStream.Position = 0; 

var xdoc = XDocument.Load(isoFileStream); 
var reminderNodes = from n in xdoc.Descendants("Reminders") select n; 

foreach (var n in reminderNodes) 
{ 
    ProcessReminder(n); 
} 

void ProcessReminder(XElement node) 
{ 
    // do something... for now I'll just output to console. 
    Console.WriteLine("Name: {0}", n.Element("Name").Value); 
    Console.WriteLine("Title: {0}", n.Element("Title").Value); 
    Console.WriteLine("BeginTime: {0}", n.Element("BeginTime").Value); 
    Console.WriteLine(); 
} 
0

XmlReader에서 데이터를 가져 오는 대신 XmlNode.Value를 사용하는 것이 좋습니다.

0

xsd.exe 도구를 사용하여 XM에서 .XSD를 생성하고 .XSD에서 C# 클래스를 생성 한 다음, LINQ 구문을 사용하여 심문하는 것이 좋습니다.

This might help 또는 this search

+0

그저 하나의 XML 노드를 가져 오는 작업이 많습니다. – code4life

0

대신 Linq2Xml를 사용하여 XmlReader를

2

의 된 XmlDocument를 사용할 수는 XDocument에 훨씬 더 쉽게

var xDoc = XDocument.Load(filename); 
var reminders = xDoc.Descendants("Reminders") 
        .Select(r => new 
        { 
         Name = (string)r.Element("Name"), 
         Title = (string)r.Element("Title"), 
         Content = (string)r.Element("Content"), 
         BeginTime = (DateTime)r.Element("BeginTime"), 
        }) 
        .ToList(); 

var firstTitle = reminders[0].Title; 

또는

var remDicts = xDoc.Descendants("Reminders") 
     .Select(r => r.Elements().ToDictionary(e => e.Name.LocalName, e => e.Value)) 
     .ToList(); 

var firstTitle = remDicts[0]["Title"];