Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用属性直接访问和编辑xml节点_C#_Xml_Editing - Fatal编程技术网

C# 使用属性直接访问和编辑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

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.
我需要通过两个属性选择一个节点(页面标签中的“否”和pic标签中的“pos”)

我发现:

在可以直接访问的情况下,除了我不了解解决方案之外,我认为它使用了xpath对象,无法修改和保存更改

最好的方法是什么

  • 直接访问xml节点(我负责该节点是唯一的)
  • 编辑该节点
  • 保存对xml的更改
  • 谢谢
    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);