C# 用XDocument确定标记关闭
我有一个XML文档,我循环并解析输出到控制台。所有工作等,但我需要能够确定标记从父节点关闭的位置。例如:C# 用XDocument确定标记关闭,c#,xml,xml-parsing,linq-to-xml,C#,Xml,Xml Parsing,Linq To Xml,我有一个XML文档,我循环并解析输出到控制台。所有工作等,但我需要能够确定标记从父节点关闭的位置。例如: <activity date="2013-07-05T06:42:35" name="open" host="55.555.20.5554"> <user id="EU-user@email.co.uk" name="J Bloggs" memberType="E" /> <storageObject docId="4130-7447-0000" nam
<activity date="2013-07-05T06:42:35" name="open" host="55.555.20.5554">
<user id="EU-user@email.co.uk" name="J Bloggs" memberType="E" />
<storageObject docId="4130-7447-0000" name="Documents name" size="1903885" fileExtension="pdf">
<cabinet name="Client Cabinet">NG-XXXXXX</cabinet>
<Matter>0000</Matter>
<Client>X54654</Client>
<Author>L Bloggs</Author>
</storageObject>
</activity>
NG-XXXXXX
0000
X54654
L布洛格斯
在每个活动结束时,我希望能够输出一行,以确定控制台输出中每个活动结束的位置
是否有方法使用XDocument确定元素“close”标记何时出现 您不需要确定标记关闭的位置。XDocument将为您确定:
var activities = from a in xdoc.Descendants("activity")
let u = a.Element("user")
let so = a.Element("storageObject")
select new {
Date = (DateTime)a.Attribute("date"),
Name = (string)a.Attribute("name"),
User = new {
Id = (string)u.Attribute("id"),
Name = (string)u.Attribute("name")
},
Storage = new {
Client = (string)so.Element("Client")
}
//...
};
它创建了您可以迭代的强类型对象:
foreach(var activity in activities)
Console.WriteLine("{0} on {1}", activity.Name, activity.Date);
您不需要确定标记关闭的位置。XDocument将为您确定:
var activities = from a in xdoc.Descendants("activity")
let u = a.Element("user")
let so = a.Element("storageObject")
select new {
Date = (DateTime)a.Attribute("date"),
Name = (string)a.Attribute("name"),
User = new {
Id = (string)u.Attribute("id"),
Name = (string)u.Attribute("name")
},
Storage = new {
Client = (string)so.Element("Client")
}
//...
};
它创建了您可以迭代的强类型对象:
foreach(var activity in activities)
Console.WriteLine("{0} on {1}", activity.Name, activity.Date);
那么:
// Load document into XDocument instance.
var doc = XDocument.Load("source.txt");
// query for all <activity> element.
var activities = doc.Root.Elements("activity");
// add XComment after each of them.
foreach (var a in activities)
{
a.AddAfterSelf(new XComment("------------"));
}
// Print document into console.
Console.WriteLine(doc.ToString());
//将文档加载到XDocument实例中。
var doc=XDocument.Load(“source.txt”);
//查询所有元素。
var活动=单据根元素(“活动”);
//在它们之后添加XComment。
foreach(活动中的var a)
{
a、 AddAfterSelf(新的XComment(--------------);
}
//将文档打印到控制台中。
Console.WriteLine(doc.ToString());
它在每次
之后打印怎么样:
// Load document into XDocument instance.
var doc = XDocument.Load("source.txt");
// query for all <activity> element.
var activities = doc.Root.Elements("activity");
// add XComment after each of them.
foreach (var a in activities)
{
a.AddAfterSelf(new XComment("------------"));
}
// Print document into console.
Console.WriteLine(doc.ToString());
//将文档加载到XDocument实例中。
var doc=XDocument.Load(“source.txt”);
//查询所有元素。
var活动=单据根元素(“活动”);
//在它们之后添加XComment。
foreach(活动中的var a)
{
a、 AddAfterSelf(新的XComment(--------------);
}
//将文档打印到控制台中。
Console.WriteLine(doc.ToString());
它会在每次
之后打印,不清楚您想做什么。您是在解析xml还是在搜索结束标记?XDocument应该用于解析XML,因为我正在解析XML。每个元素和属性的内容都写入控制台。我想做的是检测每个
标记出现的位置,这样我就可以确定哪些活动是不清楚您要做什么的。您是在解析xml还是在搜索结束标记?XDocument应该用于解析XML,因为我正在解析XML。每个元素和属性的内容都写入控制台。我试图做的是检测每个
标记出现的位置,以便确定哪些活动是哪个活动如果某个属性或元素恰好为null,这会影响XDocument处理它的方式吗?@jordanmofat这取决于属性是否具有接受null作为值的类型。例如,对于字符串,它是可以的,因此,如果没有name
属性,那么name将具有null
值。对于DateTime
您将有异常。因此,请改用可为空的DateTime:(DateTime?)a.Attribute(“date”)
我尝试过这个解决方案,但它只显示顶级属性,而且我似乎找不到让它检测子级的方法nodes@JordanMoffat为什么它找不到?它可以。用户
元素的属性不属于活动
元素。若要获取用户的属性,则应获取user元素。我已经用内部节点划分更新了示例这就是我的基本意思。我想我必须指定不同的级别,但我找不到一种方法来指定。如果某个属性或元素恰好为null,这会影响XDocument处理它的方式吗?@jordanmofat这取决于属性是否具有接受null作为值的类型。例如,对于字符串,它是可以的,因此,如果没有name
属性,那么name将具有null
值。对于DateTime
您将有异常。因此,请改用可为空的DateTime:(DateTime?)a.Attribute(“date”)
我尝试过这个解决方案,但它只显示顶级属性,而且我似乎找不到让它检测子级的方法nodes@JordanMoffat为什么它找不到?它可以。用户
元素的属性不属于活动
元素。若要获取用户的属性,则应获取user元素。我已经用内部节点划分更新了示例这就是我的基本意思。我想我必须指定不同的级别,但我找不到一种方法来实现它