Parse()无法获取所有元素

时间:2016-12-15 23:59:34

标签: c# xml

我想要解析它的smailler XML文件。

<?xml version="1.0" encoding="utf-8"?>
<!-- GeeSuth Checker Time -->
<Geranal>
  <AftrNoon Min="20" StartAftrNoon="05:00:00" EndAftrNoon="11:01:00" />
  <Night Min="50" StartNight="2:00:00" EndNight="6:00:00" />
  <AlFajr Min="100" StartAlfajr="9:00:00" EndAlfajr="10:00:00" />
</Geranal>

我希望获得所有价值,例如

<AftrNoon Min="20" StartAftrNoon="05:00:00" EndAftrNoon="11:01:00" />

我需要在字符串参数中保存值:。

  

最小

     

StartAftrNoon

     

EndAftrNoon

并将其保存在参数中?

即时使用:。

XmlReader ReaderXML = XmlReader.Create("Date.xml");
while (ReaderXML.Read())
{
    ReaderXML.IsStartElement("Geranal");
    if (ReaderXML.NodeType == XmlNodeType.Element && ReaderXML.Name == "AftrNoon")
    {
        //AftarNoon Fill
        txt_Min_Aftrnoon.Text = ReaderXML.GetAttribute(0);
        dt_Aftr_start.Text = ReaderXML.GetAttribute(1);
        dt_aftar_End.Text = ReaderXML.GetAttribute(2);
    }
    if (ReaderXML.NodeType == XmlNodeType.Element && ReaderXML.Name == "Night")
    {
        txt_Min_Night.Text = ReaderXML.GetAttribute(0);
        dt_Night_Start.Text = ReaderXML.GetAttribute(1);
        dt_Night_end.Text = ReaderXML.GetAttribute(2);
    }
    if (ReaderXML.NodeType == XmlNodeType.Element && ReaderXML.Name == "AlFajr")
    {
        txt_Min_Fajr.Text = ReaderXML.GetAttribute(0);
        dt_Fajr_Start.Text = ReaderXML.GetAttribute(1);
        dt_fajar_end.Text = ReaderXML.GetAttribute(2);
    }
}

不是所有元素都有价值。

2 个答案:

答案 0 :(得分:3)

只需将所有名称/值对放入字典即可。使用 Linq2Xml

var values = XDocument.Load(filename)
            .Descendants("AftrNoon")
            .First()
            .Attributes()
            .ToDictionary(a => a.Name, a => a.Value);

现在你可以像

那样访问它们了
var min = values["Min"];

foreach(var kv in values)
{
    Console.WriteLine(kv.Key + ":" + kv.Value);
}

答案 1 :(得分:1)

从XML开始,对于难以解析的属性命名存在一个小问题 - 元素AlFajr具有大写F,但属性却没有。如果你可以解决这个问题,那么这段代码很有效:

var xd = XDocument.Load("Date.xml");

var nodes =
(
    from e in xd.Root.Elements()
    let Min = e.Attribute("Min").Value
    let Start = e.Attribute("Start" + e.Name.LocalName).Value
    let End = e.Attribute("End" + e.Name.LocalName).Value
    select new { e.Name, Min, Start, End, }
).ToDictionary(x => x.Name, x => new { x.Min, x.Start, x.End });

这给了我这个:

results

现在我可以用它来轻松填充你的字段:

txt_Min_Aftrnoon.Text = nodes["AftrNoon"].Min;
dt_Aftr_start.Text = nodes["AftrNoon"].Start;
dt_aftar_End.Text = nodes["AftrNoon"].End;
txt_Min_Night.Text = nodes["Night"].Min;
dt_Night_Start.Text = nodes["Night"].Start;
dt_Night_end.Text = nodes["Night"].End;
txt_Min_Fajr.Text = nodes["AlFajr"].Min;
dt_Fajr_Start.Text = nodes["AlFajr"].Start;
dt_fajar_end.Text = nodes["AlFajr"].End;

或者,您也可以为文本框设置字典,并使用上面的代码分配如下值:

var textBoxes = new []
{
    new { Name = "AftrNoon", Min = txt_Min_Aftrnoon, Start = dt_Aftr_start, End = dt_aftar_End },
    new { Name = "Night", Min = txt_Min_Night, Start = dt_Night_Start, End = dt_Night_end },
    new { Name = "AlFajr", Min = txt_Min_Fajr, Start = dt_Fajr_Start, End = dt_fajar_end },
};

foreach (var tb in textBoxes)
{
    tb.Min.Text = nodes[tb.Name].Min;
    tb.Start.Text = nodes[tb.Name].Start;
    tb.End.Text = nodes[tb.Name].End;
}

另一种替代方案,即无需修复属性命名问题,就是这样做:

var xd = XDocument.Load("Date.xml");

txt_Min_Aftrnoon.Text = xd.Root.Element("AftrNoon").Attribute("Min").Value;
dt_Aftr_start.Text = xd.Root.Element("AftrNoon").Attribute("StartAftrNoon").Value;
dt_aftar_End.Text = xd.Root.Element("AftrNoon").Attribute("EndAftrNoon").Value;
txt_Min_Night.Text = xd.Root.Element("Night").Attribute("Min").Value;
dt_Night_Start.Text = xd.Root.Element("Night").Attribute("StartNight").Value;
dt_Night_end.Text = xd.Root.Element("Night").Attribute("EndNight").Value;
txt_Min_Fajr.Text = xd.Root.Element("AlFajr").Attribute("Min").Value;
dt_Fajr_Start.Text = xd.Root.Element("AlFajr").Attribute("StartAlfajr").Value;
dt_fajar_end.Text = xd.Root.Element("AlFajr").Attribute("EndAlfajr").Value;