使用 Linq 解析 XML 文档时仅获取第一个值
Only getting the first value while parsing an XML document using Linq
我的 XML 文件:
<tracking>
<tracking>
<course id="1" name="AGL" nbrecredits="3">
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
<instructor id="2" name="Maroun"/>
<session date="10-10-2012" numberOfsessions="4"/>
<session date="9-10-2012" numberOfsessions="1"/>
</course>
<course id="2" name="projet de programmationa avancee" nbrecredits="3">
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
</course>
<course id="2" name="poo" nbrecredits="3">
<instructor id="2" name="Maroun">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="3"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="2.5"/>
</instructor>
<instructor id="2" name="Samir"></instructor>
</course>
</tracking>
</tracking>
由此 XML 我想计算每门课程和每位讲师的剩余课时(考虑到每门课程有 15 节课)。
因此,首先我想获得第一门课程 (AGL) 每位讲师的课时数。我的问题是我只能获得 numberOfsessions
等于 1
.
的第一个会话
使用此 C# 代码:
var xDoc = XDocument.Load(@"C:\Users\Gaby\Desktop\a.xml");
var homePhone = from phoneno in xDoc.Root.Element("tracking").Elements("course")
where phoneno.Attribute("name").Value.Equals("AGL")
select phoneno;
foreach (XElement xEle in homePhone)
{
Console.WriteLine(xEle.Element("instructor").Element("session").Attribute("numberOfsessions").Value);
}
我试着获取每门课程的讲师姓名(比如“AGL”应该让我得到“Youssef”和“Maroun”,但它只让我得到“Youssef”(第一个 xml 元素)。
我什至尝试用 IEnumerable<string> homePhone
替换 var homePhone
但是在将它解析为列表时我得到了一个空指针。
而且我还有另一个问题,我想使用 Linq 和 c# 在我的 xml 文件中为每个讲师插入新会话,所以有什么方法可以编辑现有的 XElements 还是应该创建一个新的每次 XElement?
感谢您的宝贵时间。
问题出在您的 xml 文件中?
<tracking>
<tracking>
<course id="1" name="AGL" nbrecredits="3">
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
<instructor id="2" name="Maroun"/>
<session date="10-10-2012" numberOfsessions="4"/>
<session date="9-10-2012" numberOfsessions="1"/>
</instructor> <-- Missing XML end tag!
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument xDoc = XDocument.Load(FILENAME);
List<XElement> homePhone = (from phoneno in xDoc.Descendants("course")
where (string)phoneno.Attribute("name") == ("AGL")
select phoneno).ToList();
foreach (XElement instructor in homePhone.Elements("instructor"))
{
foreach (XElement session in instructor.Elements("session"))
{
Console.WriteLine("id = '{0}', name = '{1}', credits = '{2}', date = '{3}', number of sessions = '{4}'",
(string)instructor.Attribute("id"),
(string)instructor.Attribute("name"),
(string)instructor.Attribute("nbrecredits"),
(string)session.Attribute("date"),
(string)session.Attribute("numberOfsessions")
);
}
}
}
}
}
我的 XML 文件:
<tracking>
<tracking>
<course id="1" name="AGL" nbrecredits="3">
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
<instructor id="2" name="Maroun"/>
<session date="10-10-2012" numberOfsessions="4"/>
<session date="9-10-2012" numberOfsessions="1"/>
</course>
<course id="2" name="projet de programmationa avancee" nbrecredits="3">
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
</course>
<course id="2" name="poo" nbrecredits="3">
<instructor id="2" name="Maroun">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="3"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="2.5"/>
</instructor>
<instructor id="2" name="Samir"></instructor>
</course>
</tracking>
</tracking>
由此 XML 我想计算每门课程和每位讲师的剩余课时(考虑到每门课程有 15 节课)。
因此,首先我想获得第一门课程 (AGL) 每位讲师的课时数。我的问题是我只能获得 numberOfsessions
等于 1
.
使用此 C# 代码:
var xDoc = XDocument.Load(@"C:\Users\Gaby\Desktop\a.xml");
var homePhone = from phoneno in xDoc.Root.Element("tracking").Elements("course")
where phoneno.Attribute("name").Value.Equals("AGL")
select phoneno;
foreach (XElement xEle in homePhone)
{
Console.WriteLine(xEle.Element("instructor").Element("session").Attribute("numberOfsessions").Value);
}
我试着获取每门课程的讲师姓名(比如“AGL”应该让我得到“Youssef”和“Maroun”,但它只让我得到“Youssef”(第一个 xml 元素)。
我什至尝试用 IEnumerable<string> homePhone
替换 var homePhone
但是在将它解析为列表时我得到了一个空指针。
而且我还有另一个问题,我想使用 Linq 和 c# 在我的 xml 文件中为每个讲师插入新会话,所以有什么方法可以编辑现有的 XElements 还是应该创建一个新的每次 XElement?
感谢您的宝贵时间。
问题出在您的 xml 文件中?
<tracking>
<tracking>
<course id="1" name="AGL" nbrecredits="3">
<instructor id="1" name="youssef">
<session date="10-10-2012" numberOfsessions="1"/>
<session date="9-10-2012" numberOfsessions="2"/>
<session date="8-10-2012" numberOfsessions="1"/>
<session date="7-10-2012" numberOfsessions="1.5"/>
</instructor>
<instructor id="2" name="Maroun"/>
<session date="10-10-2012" numberOfsessions="4"/>
<session date="9-10-2012" numberOfsessions="1"/>
</instructor> <-- Missing XML end tag!
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument xDoc = XDocument.Load(FILENAME);
List<XElement> homePhone = (from phoneno in xDoc.Descendants("course")
where (string)phoneno.Attribute("name") == ("AGL")
select phoneno).ToList();
foreach (XElement instructor in homePhone.Elements("instructor"))
{
foreach (XElement session in instructor.Elements("session"))
{
Console.WriteLine("id = '{0}', name = '{1}', credits = '{2}', date = '{3}', number of sessions = '{4}'",
(string)instructor.Attribute("id"),
(string)instructor.Attribute("name"),
(string)instructor.Attribute("nbrecredits"),
(string)session.Attribute("date"),
(string)session.Attribute("numberOfsessions")
);
}
}
}
}
}