1

この構造のxmlファイルがあります。ノード「設定」は 1 回だけ繰り返されます。ノード「リマインダー」は+1回表示できます。

<?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
4

5 に答える 5

2

Linq2Xmlの使用ははるかに簡単です

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"];
于 2012-11-06T19:15:00.643 に答える
1

XDocumentLINQ to 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();
}
于 2012-11-06T19:35:34.277 に答える
0

XmlReaderの代わりにXmlDocumentを使用できます

于 2012-11-06T19:14:54.000 に答える
0

XmlReader からデータを取得する代わりに、XmlNode.Value を使用することをお勧めします。

于 2012-11-06T19:10:06.170 に答える
0

xsd.exe ツールを使用して XM から .XSD を生成し、.XSD から C# クラスを生成し、その後、LINQ 構文を使用して問い合わせることをお勧めします。

これが役立つか、この検索

于 2012-11-06T19:12:29.967 に答える