Обновить значение XAttribute, где XAttribute Name = X - PullRequest
10 голосов
/ 19 мая 2011

У меня есть следующий код, который создает файл XML с кучей информации о заказе. Я хотел бы иметь возможность обновить запись в этом XML-файле вместо того, чтобы удалять все и заново добавлять все снова.

Я знаю, что могу сделать это:

xElement.Attribute(attribute).Value = value;

Но это изменит каждый атрибут с тем же именем, что и атрибут. Как я могу изменить значение чего-либо, только если идентификатор записи равен «jason», например? Нужно ли загружать файл XML, выполнять итерацию по всему файлу, пока не будет найдено соответствие для атрибута, который я хочу изменить, затем изменить его и снова сохранить файл?

Любая помощь / предложения приветствуются.

XElement xElement;
xElement = new XElement("Orders");

XElement element = new XElement(
    "Order",
    new XAttribute("Id", CustomId),
    new XAttribute("Quantity", Quantity),
    new XAttribute("PartNo", PartNo),
    new XAttribute("Description", Description),
    new XAttribute("Discount", Discount),
    new XAttribute("Freight", Freight),
    new XAttribute("UnitValue", UnitValue),
    new XAttribute("LineTotal", LineTotal)
    );
xElement.Add(element);
xElement.Save(PartNo + ".xml");

Вот как выглядит мой XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<Orders>
    <Order Id="V45Y7B458B" Quantity="2" PartNo="5VNB98" Description="New Custom Item Description" Discount="2.00" Freight="2.90" UnitValue="27.88" LineTotal="25.09" />
    <Order Id="jason" Quantity="2" PartNo="jason" Description="New Custom Item Description" Discount="2.00" Freight="2.90" UnitValue="27.88" LineTotal="25.09" />
</Orders>

Ответы [ 3 ]

8 голосов
/ 19 мая 2011

Примерно так:

var doc = XDocument.Load("FileName.xml");
var element = doc.Descendants("Order")
    .Where(arg => arg.Attribute("Id").Value == "jason")
    .Single();
element.Attribute("Quantity").Value = "3";
doc.Save("FileName.xml");
3 голосов
/ 19 мая 2011

Поскольку вы создали файл XML, вы знаете корневой элемент XML, поэтому вы можете использовать этот код для получения нужного элемента:

TaxonPath = XElement.Parse(xml as string);
txtSource.Text = FindGetElementValue(TaxonPath, TaxonPathElement.Source);

XElement FindGetElementValue(XElement tree,String elementname)
{
    return tree.Descendants(elementName).FirstOrDefault();
}

С этим вы можете получить элемент, проверить его значение и изменить его по своему желанию.

3 голосов
/ 19 мая 2011

Сначала вам нужно найти элемент, который вы хотите обновить. Если вы найдете его, сделайте обновление. Просто не забудьте сохранить XDocument обратно в файл, когда вы закончите.

XDocument doc = ...;
var jason = doc
    .Descendants("Order")
    .Where(order => order.Attribute("Id").Value == "jason") // find "jason"
    .SingleOrDefault();
if (jason != null) // if found,
{
    // update something
    jason.Attribute("Quantity").SetValue(20);
}
doc.Save(...); // save if necessary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...