C# 使用属性直接访问和编辑xml节点
El Padrino展示了一个解决方案: 可以直接加载xml元素(每个..都没有)、编辑和保存 我的xml是:C# 使用属性直接访问和编辑xml节点,c#,xml,editing,C#,Xml,Editing,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
<?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.
我需要通过两个属性选择一个节点(页面标签中的“否”和pic标签中的“pos”)
我发现:
在可以直接访问的情况下,除了我不了解解决方案之外,我认为它使用了xpath对象,无法修改和保存更改
最好的方法是什么
Asaf您可以使用与链接到的第一个答案相同的模式,但需要在XPath中包含属性的条件。基本XPath是
g/page/row/pic
。由于希望page
的no
属性为1
,因此可以在页面上添加[@no='1']
作为谓词。因此,完整的XPath查询类似于g/page[@no='1']/row/pic[@pos='1']
。SelectSingleNode将返回一个可变的XmlNode对象,因此您可以修改该对象并保存原始文档以保存更改
将XPath与以下内容结合在一起:
使用新的、设计良好的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);
XDocument doc=XDocument.Load(文件名);
var pages=doc.Root.Elements(“page”)。其中(page=>(int?)page.Attribute(“no”)==1);
var rows=pages.SelectMany(page=>page.Elements(“行”);
var pics=rows.SelectMany(row=>row.Elements(“pic”)。其中(pic=>(int?)pic.Attribute(“pos”)==1);
foreach(pics中的var pic)
{
//产出1
控制台写入线(pic);
//产出1
控制台写入线(图片值);
//更改值
pic.值=2;
}
文件保存(文件名);
XDocument帮助我使用一个对象对xml文件执行所需的所有操作。但是我不能做像a=pic[0]这样的事情;不管怎样,谢谢alot@Asaf:如果在pics
声明的末尾写入.ToArray()
,则可以转到pics[0]
。但是,如果您不需要这样的数组,那么pic.First()
是最有效的解决方案。
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);