Как я делаю глубокую копию элемента в LINQ к XML?

url="jdbc:postgresql//localhost:5432/mmas"

Этот URL-адрес выглядит неправильно, вам нужно следующее:

url="jdbc:postgresql://localhost:5432/mmas"
62
задан Jim G. 16 October 2009 в 18:21
поделиться

4 ответа

Нет никакой потребности повторно проанализировать. Один из конструкторов XElement берет другой XElement и делает глубокую копию из него:

XElement original = new XElement("original");
XElement deepCopy = new XElement(original);

Вот несколько модульных тестов для демонстрации:

[TestMethod]
public void XElementShallowCopyShouldOnlyCopyReference()
{
    XElement original = new XElement("original");
    XElement shallowCopy = original;
    shallowCopy.Name = "copy";
    Assert.AreEqual("copy", original.Name);
}

[TestMethod]
public void ShouldGetXElementDeepCopyUsingConstructorArgument()
{
    XElement original = new XElement("original");
    XElement deepCopy = new XElement(original);
    deepCopy.Name = "copy";
    Assert.AreEqual("original", original.Name);
    Assert.AreEqual("copy", deepCopy.Name);
}
119
ответ дан TheCloudlessSky 24 November 2019 в 16:43
поделиться

Это похоже на ToString, и метод пересинтаксического анализа является лучшим способом. Вот код:

XElement copy = XElement.Parse(original.ToString());
8
ответ дан Daniel Plaisted 24 November 2019 в 16:43
поделиться

Я не полагаю, что существует существующий механизм, который позволяет, Вы для выполнения глубокой копии XNode разрабатываете дерево. Я думаю, что Вас оставляют с двумя опциями.

  1. Делают, поскольку Вы предложили преобразование в строку и затем обратно в дерево
  2. Запись на себе с шаблоном "посетитель"

, шаблон "посетитель", конечно, возможен, но потребуется большая работа тестирование. Я думаю, что Вашим наилучшим вариантом является № 1.

-2
ответ дан JaredPar 24 November 2019 в 16:43
поделиться

Снятый непосредственно от C# 3.0 вкратце :

, Когда узел или атрибут добавляются к элементу (ли через функциональную конструкцию или Добавить метод) узел или свойство Parent атрибута установлены на тот элемент. Узел может иметь только один родительский элемент: если Вы добавляете уже порожденный узел к второму родителю, узел автоматически глубоко клонирован. В следующем примере у каждого клиента есть отдельная копия адреса:

var address = new XElement ("address",
                  new XElement ("street", "Lawley St"),
                  new XElement ("town", "North Beach")
              );
var customer1 = new XElement ("customer1", address);
var customer2 = new XElement ("customer2", address);

customer1.Element ("address").Element ("street").Value = "Another St";
Console.WriteLine (
  customer2.Element ("address").Element ("street").Value);   // Lawley St

Это автоматическое дублирование сохраняет инстанцирование X-объекта-DOM свободным от стороны effects— другой признак функционального программирования.

3
ответ дан Wonko 24 November 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: