2012-03-06 3 views
0

Мой XML выглядит следующим образом:Как изменить значение узла XML на основе другого узла на одном уровне?

<?xml version = "1.0" encoding = "utf-8"?> 
<gallery> 
    <name>Rosie's Gallery</name> 
    <image> 
    <order>0</order> 
    <url>images/HappyIcon.jpg</url> 
    <title>Happy</title> 
    </image> 
    <image> 
    <order>1</order> 
    <url>images/SickIcon.jpg</url> 
    <title>Sick</title> 
    </image> 
</gallery> 

Если у меня есть значение URL-адрес доступной для меня, как бы я идти об изменении соответствующего значения заголовка? Я пытался понять это, но я попадаю в дорожный блок.

+0

Какой код вы пробовали до сих пор, и то, что идет не так? –

+0

Почему вы помещаете этот вопрос в WPF? – AngeloBad

+0

Ну, я пытался использовать что-то вроде currentDoc.DocumentElement.SetAttribute ("image [url = '" + imageLocation + "']", "new url value here"); , но ему не понравилось значение пути. Я надеялся, что кто-то знает, как это сделать – Blake

ответ

1
XDocument xDoc = XDocument.Load(new StringReader(xmlstr)); 
string url="images/SickIcon.jpg"; 

var image = xDoc.Descendants("image") 
       .Where(x => x.Element("url").Value == url) 
       .First(); 
image.Element("title").Value = "Renamed Value"; 
+0

Осторожно: этот код выдаст исключение, если; нет элемента с именем url (null reference exception), нет соответствующего url для Value (null reference exception) или нет элемента с названием названия (исключение с использованием ссылки). –

+0

Это работает. Спасибо! – Blake

1

Если вы используете LinqToXml это будет выглядеть так: (если у вас нет повторяющихся URLs)

var urlValue = "images/SickIcon.jpg"; 
var newTitle = "New Title"; 

XDocument xdoc = XDocument.Load("<uri to file>"); 
XElement xImage = XDocument.root 
    .Descendants("image") 
    .FirstOrDefault(element => element.Elements("url").Any() 
          && element.Elements("title").Any() 
          && element.Elements("url").First().Value == urlValue); 

if (xImage != null) 
{ 
    xImage.Elements("title").First().Value = newTitle; 
} 
+0

это тоже работает! здорово! Спасибо большое! Я бы оценил их обоих как ответ, но я закончил использовать другой, и он не позволит мне выбрать оба, я думаю – Blake

Смежные вопросы