Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用XDocument确定标记关闭_C#_Xml_Xml Parsing_Linq To Xml - Fatal编程技术网

C# 用XDocument确定标记关闭

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

我有一个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" 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元素。我已经用内部节点划分更新了示例这就是我的基本意思。我想我必须指定不同的级别,但我找不到一种方法来实现它