El Padrino展示了一个解决方案:
可以直接加载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对象并保存更改。
的最佳方式是什么?
由于 阿萨夫
答案 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);