使用linq更新XmlDocument(可能)

时间:2009-01-29 14:56:15

标签: c# xml linq

我在内存中有一个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;
    }

但我有点失落。有什么想法吗?

2 个答案:

答案 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);