Обновление XmlDocument с использованием linq (возможно) - PullRequest
1 голос
/ 29 января 2009

У меня есть объект 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 ]

2 голосов
/ 29 января 2009

Следующий элемент добавит для вас

xDoc.Descendants("term").Single(t => t.Descendants("name").Single().Value == name).Add(new XElement("image", "hi there"));

Самая большая проблема, с которой я сталкиваюсь, заключается в том, что вам нужно переключаться между XmlDocument и XDocument. Я рекомендую, если вы собираетесь использовать XmlDocument, тогда используйте XPath, а если вы хотите использовать LINQ, тогда используйте XDocument. Это постоянное переключение убьет производительность и ремонтопригодность.

1 голос
/ 29 января 2009

Вот как это сделать с xPath, просто для ясности

termDoc.SelectSingleNode("//term[name='" + name + "']").AppendChild(imageNode);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...