无法从XML获取单个XElement

时间:2016-09-26 19:01:07

标签: c# linq-to-xml

我有一个XML文件,结构如下:

let

我发送一个新的XML元素,如上所示,它将类似于:

<scan client="Computer1" end="9/20/2016 7:00:00 AM" start="9/20/2016 7:00:00 AM">
  <childfile>
    <name>file.ext</name>
    <lastmodified>8/31/2016</lastmodified>
    <age>19</age>
  </childfile>
  <childfile>
    <name>file2.ext</name>
    <lastmodified>9/1/2016</lastmodified>
    <age>18</age>
  </childfile>
  <childfile>
    <name>file3.ext</name>
    <lastmodified>8/19/2016</lastmodified>
    <age>31</age>
  </childfile>
  <childfile>
    <name>file4.ext</name>
    <lastmodified>8/23/2016</lastmodified>
    <age>27</age>
  </childfile>
</scan>
<scan client="Computer2" end="9/20/2016 7:00:00 AM" start="9/20/2016 7:00:00 AM">
  <childfile>
    <name>file.ext</name>
    <lastmodified>8/31/2016</lastmodified>
    <age>19</age>
  </childfile>
  <childfile>
    <name>file2.ext</name>
    <lastmodified>9/1/2016</lastmodified>
    <age>18</age>
  </childfile>
  <childfile>
    <name>file3.ext</name>
    <lastmodified>8/19/2016</lastmodified>
    <age>31</age>
  </childfile>
  <childfile>
    <name>file4.ext</name>
    <lastmodified>8/23/2016</lastmodified>
    <age>27</age>
  </childfile>
</scan>

如何搜索原始XML以查看它是否具有与所提供的客户端属性匹配的客户端属性的扫描部分,如果它与之匹配,则将该元素替换为所提供的元素。如果它没有找到匹配项,则需要将该元素添加到现有元素中。

我试图使用:

<scan client="Computer1" end="9/25/2016 7:00:00 AM" start="9/25/2016 7:00:00 AM">
  <childfile>
    <name>file.ext</name>
    <lastmodified>8/31/2016</lastmodified>
    <age>19</age>
  </childfile>
  <childfile>
    <name>file2.ext</name>
    <lastmodified>9/1/2016</lastmodified>
    <age>18</age>
  </childfile>
</scan>

使用

设置客户端var
originalXML.Elements("scan").SingleOrDefault(e => e.Attribute("client").Value == client)

似乎每次都返回null,即使我检查了客户端字符串并将其设置为&#34; Computer1&#34;。

关于为什么这总是返回null的任何想法?

1 个答案:

答案 0 :(得分:0)

你有两个问题......

  1. 格式错误的XML - 您必须拥有根元素
  2. 您需要参考&#34;扫描&#34;关闭根对象的元素
  3. 所以你的linq2xml看起来像这样......

    var client = replacementXML.Root.Attribute("client").Value;
    var match = originalXML.Root.Elements("scan")
           .SingleOrDefault(e => e.Attribute("client").Value == client);
    

    好吧,我想我有点迟了......我看到你的评论说你已经修好了。 :)