我在内存中有一个XmlDocument对象,这是一个数据样本:
<terms>
<letter name="F">
<term>
<name>fascículo</name>
<translation language="en">fascicle</translation>
<definition>pequeño paquete de fibras nerviosas o musculares</definition>
</term>
(实际文件中有很多术语)
我希望能够通过名称节点找到一个术语,然后添加一个元素作为术语的子句
<terms>
<letter name="F">
<term>
<name>fascículo</name>
<translation language="en">fascicle</translation>
<definition>pequeño paquete de fibras nerviosas o musculares</definition>
<image>hi there</image>
</term>
现在我可以使用Xpath实现这一点,找到节点,然后用新值创建一个新节点,等等。
但在linq的世界里似乎有点长篇大论。
这是我到目前为止所做的:
private static XmlDocument AddImages(XmlDocument termDoc)
{
XDocument xDoc = XDocument.Load(new XmlNodeReader(termDoc));
using (CsvReader csv = new CsvReader(new StreamReader("spa2engimages.csv"), false))
{
csv.ReadNextRecord();
csv.ReadNextRecord();
XElement selectedTerm;
string name, imageref;
while (csv.ReadNextRecord())
{
imageref = csv[0].ToString();
name = csv[3].ToString();
selectedTerm = xDoc.Descendants("term").Single(t => t.Descendants("name").Single().Value == name);
//now want to add a new node and save it back in to the termDoc somehow
}
}
return termDoc;
}
但我有点失落。有什么想法吗?
答案 0 :(得分:2)
以下内容将为您添加元素
xDoc.Descendants("term").Single(t => t.Descendants("name").Single().Value == name).Add(new XElement("image", "hi there"));
我看到的最大问题是让你变得笨重,你需要在XmlDocument和XDocument之间来回切换。我建议如果你打算使用XmlDocument然后使用XPath,如果你想使用LINQ,那么使用XDocument。这种不断的切换会破坏性能和可维护性。
答案 1 :(得分:1)
这是如何使用xPath进行的,只是为了清晰起见
termDoc.SelectSingleNode("//term[name='" + name + "']").AppendChild(imageNode);