【问题标题】:Determing tag close with XDocument使用 XDocument 确定标签关闭
【发布时间】:2013-08-13 16:23:54
【问题描述】:

我有一个 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>

在每个活动结束时,我希望能够输出一行以确定每个活动结束的控制台输出。

有没有办法使用 XDocument 确定元素“关闭”标记何时出现?

【问题讨论】:

  • 不清楚您要做什么。您是在解析 xml 还是在搜索结束标签? XDocument 应该用于解析
  • 我正在解析 XML。每个元素和属性的内容都会写入控制台。我要做的是检测每个&lt;/activty&gt; 标签出现的位置,以便我可以确定哪些活动是哪些

标签: c# xml xml-parsing linq-to-xml


【解决方案1】:

您无需确定标签的关闭位置。 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 处理它的方式吗?
  • @JordanMoffat 取决于属性是否具有接受 null 作为值的类型。例如。对于字符串没关系,因此如果没有name 属性,您将有null 值作为名称。对于DateTime,你会有例外。因此,请改用可为空的 DateTime:(DateTime?)a.Attribute("date")
  • 我试过这个解决方案,但它只显示顶级属性,我似乎无法找到一种方法让它检测子节点
  • @JordanMoffat 为什么找不到?它可以。 user 元素的属性不是 activity 元素的一部分。如果要获取用户的属性,则应获取用户元素。我已经更新了内部节点解析的示例
  • 这就是我的意思。我想我必须指定不同的级别,但我找不到方法来做到这一点
【解决方案2】:

怎么样:

// 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());

它在每个&lt;/activity&gt; 之后打印&lt;!--- - - - - - - - - - - - --&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2019-05-09
    相关资源
    最近更新 更多