我想根据certian条件将新的XML数据插入到现有的XML格式中。我查询了条件,但我发现插入的示例似乎抛出错误"异常:对象引用未设置为对象的实例"。
这是我的XML: -
<?xml version="1.0" encoding="UTF-8"?>
<myDataInfo
xmlns:fp="http://www.Myexample.com">
<myDataReport>
<startTime second="16" minute="51" hour="8" day="1" month="9" year="2016"/>
<myDataHub type="history" location="abc">
<myDataSet location="def">
<myData type="contact" id="9c1181ca-ffe7-46ae-9d37-fdefc05e59a0" batt="100" temp="24" name="Data2">
<evt val="open" time="86160"/>
<evt val="closed" time="86156"/>
</myData>
<myData type="motion" id="39ccc3d2-ab42-4f86-aa08-7f0eb665fece" batt="100" temp="24.3" name="Data3">
<evt val="active" time="86384"/>
<evt val="inactive" time="86380"/>
</myData>
</myDataSet>
</myDataHub>
</myDataReport>
我的查询得到: -
var eventResults1 = root.Descendants()
.Elements(ns + "myData")
.Where(el => (string)el.Attribute("name") == "def")
.Elements(ns + "evt")
.Select(el => new
{
t1 = el.Attribute("time").Value,
v1 = el.Attribute("val").Value
})
我要插入mydata&#34; Data2&#34;
的数据<evt val="closed" time="87000"></evt>
我尝试使用
Elements(new XElement("evt", "time=90000,val=active"))
但我没有成功插入。
感谢您的任何指示。
答案 0 :(得分:2)
您需要获取符合条件的myData
元素:
var myData = root.Descendants(ns + "myData")
.Single(x => (string)x.Attribute("name") == "Data2");
然后添加一个新的子元素:
myData.Add(new XElement("evt",
new XAttribute("val", "closed"),
new XAttribute("time", "87000")
)
);
我建议reading the documentation或一些教程,因为大部分内容都在那里。
答案 1 :(得分:1)
我认为你让它变得比现实更困难
只要知道Elements("...")
将只返回直接的子元素(只有一个级别),Descendants("...")
将返回每个子元素,无论嵌套有多深。因此,您不需要在此Elements()
使用Descendants()
。
var myDataElement =
// Find all elements with the name "MyData"
root.Descendants("myData")
//Filter out the one that has the attribute you're looking for
.Single(element => element.Attribute("name").Value == "Data2");
//Add the new element
myDataElement.Add(
new XElement("evt",
new XAttribute("val", "closed"),
new XAttribute("time", "87000")
)
);
答案 2 :(得分:0)
尝试以下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement addElement = doc.Descendants("myData").Where(x => x.Elements("evt").Where(y => (string)y.Attribute("val") == "open").Count() == 0).FirstOrDefault();
if (addElement != null)
{
addElement.Add( new XElement("evt", new object[] {
new XAttribute("val","closed"),
new XAttribute("time","87000")
}));
}
}
}
}