【问题标题】:Linq to XML - Find an elementLinq to XML - 查找元素
【发布时间】:2012-07-06 06:23:29
【问题描述】:

我确信这是基本的,可能以前被问过,但我只是开始使用 Linq to XML。

我有一个需要读写的简单 XML。

<Documents>
...
    <Document>
      <GUID>09a1f55f-c248-44cd-9460-c0aab7c017c9-0</GUID>
      <ArchiveTime>2012-05-15T14:27:58.5270023+02:00</ArchiveTime>
      <ArchiveTimeUtc>2012-05-15T12:27:58.5270023Z</ArchiveTimeUtc>
      <IndexDatas>
        <IndexData>
          <Name>Name1</Name>
          <Value>Some value</Value>
          <DataType>1</DataType>
          <CreationTime>2012-05-15T14:27:39.6427753+02:00</CreationTime>
          <CreationTimeUtc>2012-05-15T12:27:39.6427753Z</CreationTimeUtc>
        </IndexData>
        <IndexData>
          <Name>Name2</Name>
          <Value>Some value</Value>
          <DataType>3</DataType>
          <CreationTime>2012-05-15T14:27:39.6427753+02:00</CreationTime>
          <CreationTimeUtc>2012-05-15T12:27:39.6427753Z</CreationTimeUtc>
        </IndexData>
   ...
 </IndexDatas>
</Document>
...
</Documents>

我有一个包含一堆“文档”节点的“文档”节点。

我有文档的 GUID 和“IndexData”名称。 我需要通过 GUID 查找文档并检查它是否具有带有某个名称的“IndexData”。 如果没有,我需要添加它。

任何帮助都将不胜感激,因为我在阅读和搜索槽元素时遇到问题。

目前我正在尝试使用(在 C# 中):

IEnumerable<XElement> xmlDocuments = from c in XElement
                                        .Load(filePath)
                                        .Elements("Documents") 
                                         select c;

// fetch document
 XElement documentElementToEdit = (from c in xmlDocuments where 
                    (string)c.Element("GUID").Value == GUID select c).Single();

编辑

xmlDocuments.Element("Documents").Elements("Document")

这不会返回任何结果,即使 xmlDocuments.Element("Documents") 会这样做。看起来我无法从 Documents 节点获取 Document 节点。

【问题讨论】:

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


    【解决方案1】:

    您可以使用以下代码找到那些文档(索引数据中没有相关名称的文档),然后您可以将元素添加到 IndexData 元素的末尾。

    var relatedDocs = doc.Elements("Document")
       .Where(x=>x.Element("GUID").Value == givenValue)
       .Where(x=>!x.Element("IndexDatas")
                  .Elements("IndexData")
                  .Any(x=>x.Element("Name") == someValue);
    

    【讨论】:

    • 我觉得应该是doc.Descendants("Document")
    【解决方案2】:

    这应该可行:

    var x = XDocument.Load(filePath);
    // guid in your sample xml is not a valid guid, so I changed it to a random valid one
    var requiredGuid = new Guid("E61D174C-9048-438D-A532-17311F57ED9B");
    var requiredName = "Name1";
    
    var doc = x.Root
               .Elements("Document")
               .Where(d => (Guid)d.Element("GUID") == requiredGuid)
               .FirstOrDefault();
    if(doc != null)
    {
        var data = doc.Element("IndexDatas")
                      .Elements("IndexData")
                      .Where(d => (string)d.Element("Name") == requiredName)
                      .FirstOrDefault();
        if(data != null)
        {
            // index data found
        }
        else
        {
            // index data not found
        }
    }
    else
    {
        // document not found
    }
    

    【讨论】:

    • 你好。我知道 GUID 是错误的,但应该被视为简单字符串。但我没有收到任何文件(doc 为空)!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多