Прямой доступ и редактирование к узлу xml, используя свойства - PullRequest
0 голосов
/ 23 августа 2010

Эль Падрино показал решение:

Как изменить атрибут XML

, где элемент XML может быть загружен напрямую (нет для каждого ..), отредактирован исохранено!

Мой xml:

<?xml version="1.0" encoding="ISO-8859-8"?>
<g>
  <page no="1" href="page1.xml" title="נושא 1">
    <row>
      <pic pos="1" src="D:\RuthSiteFiles\webSiteGalleryClone\ruthCompPics\C_WebBigPictures\100CANON\IMG_0418.jpg" width="150" height="120">1</pic>
    </row>
  </page>
</g>

, и мне нужно выбрать узел по двум атрибутам (1. «нет» в теге страницы и «pos» в теге pic)

Я нашел: Как получить доступ к узлу xml с атрибутами и пространством имен, используя selectsinglenode ()

, где прямой доступ возможен, но помимо факта, который я не понимаюрешение, я думаю, что оно использует объект xpath, который не может быть изменен и сохраняет изменения.

Какой лучший способ

  1. получить прямой доступ к узлу xml (я несу ответственностьчто узел будет уникальным)
  2. изменить этот узел
  3. сохранить изменения в xml

Спасибо Asaf

Ответы [ 2 ]

1 голос
/ 23 августа 2010

Вы можете использовать тот же шаблон, что и в первом ответе, с которым вы связались, но вам нужно будет включить условия для атрибутов в XPath.Ваш базовый XPath будет g/page/row/pic.Поскольку вы хотите, чтобы атрибут no для page был 1, вы добавляете [@no='1'] в качестве предиката для page.Итак, полный запрос XPath - это что-то вроде g/page[@no='1']/row/pic[@pos='1'].SelectSingleNode вернет изменяемый объект XmlNode, поэтому вы можете изменить этот объект и сохранить исходный документ, чтобы сохранить изменения.

Соединение XPath с Ответ Эль Падрино :

//Here is the variable with which you assign a new value to the attribute
string newValue = string.Empty;
XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(xmlFile);

XmlNode node = xmlDoc.SelectSingleNode("g/page[@no='1']/row/pic[@pos='1']");
node.Attributes["src"].Value = newValue;

xmlDoc.Save(xmlFile);

//xmlFile is the path of your file to be modified
0 голосов
/ 23 августа 2010

Используйте новый, хорошо спроектированный XDocument / XElement вместо старого XmlDocument API.

В вашем примере,

XDocument doc = XDocument.Load(filename);

var pages = doc.Root.Elements("page").Where(page => (int?) page.Attribute("no") == 1);
var rows = pages.SelectMany(page => page.Elements("row"));
var pics = rows.SelectMany(row => row.Elements("pic").Where(pic => (int?) pic.Attribute("pos") == 1));

foreach (var pic in pics)
{
    // outputs <pic pos="1" src="D:\RuthSiteFiles\webSiteGalleryClone\ruthCompPics\C_WebBigPictures\100CANON\IMG_0418.jpg" width="150" height="120">1</pic>
    Console.WriteLine(pic);

    // outputs 1
    Console.WriteLine(pic.Value);

    // Changes the value
    pic.Value = 2;
}

doc.Save(filename);
...