使用属性直接访问和编辑xml节点

时间:2010-08-23 11:53:55

标签: c# xml editing

El Padrino展示了一个解决方案:

How to change XML Attribute

可以直接加载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。页面标记中为“no”,pic标记中为“pos”)

我发现: How to access a xml node with attributes and namespace using selectsinglenode()

直接访问是可能的,但除了我不理解解决方案之外,我认为它使用了无法修改的xpath对象并保存更改。

的最佳方式是什么?
  1. 直接访问xml节点(我负责该节点将是唯一的)
  2. 编辑该节点
  3. 保存对xml的更改
  4. 由于 阿萨夫

2 个答案:

答案 0 :(得分:1)

您可以使用与链接的第一个答案相同的模式,但是您需要在XPath中包含属性的条件。您的基本XPath将是g/page/row/pic。由于您希望no的{​​{1}}属性为page,因此您在1上添加[@no='1']作为谓词。因此,完整的XPath查询类似于page。 SelectSingleNode将返回一个可变的XmlNode对象,因此您可以修改该对象并保存原始文档以保存更改。

将XPath与El Padrino's answer结合使用:

g/page[@no='1']/row/pic[@pos='1']

答案 1 :(得分:0)

使用设计良好的全新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);