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

发布于 2024-09-15 13:56:19 字数 986 浏览 3 评论 0原文

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

如何更改 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.页面标签中的“no”和pic标签中的“pos”)选择一个节点,

我发现: 如何访问具有属性的 xml 节点和使用 selectsinglenode() 的命名空间

,其中可以直接访问,但除了我不理解解决方案这一事实之外,我认为它使用无法修改和保存更改的 xpath 对象。

直接访问 xml 节点的最佳方法是什么

  1. (我负责该节点将是唯一的)
  2. 编辑该节点
  3. 将更改保存到 xml

谢谢 阿萨夫

El Padrino showed a solution:

How to change XML Attribute

where an xml element can be loaded directly (no for each..), edited and saved!

My xml is:

<?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>

and I need to select a node by two attributes(1. "no" in the page tag and "pos" in the pic tag)

I've found :
How to access a xml node with attributes and namespace using selectsinglenode()

where direct access is possible but beside the fact that I dont understand the solution, I think it uses the xpath object which can't be modified and save changes.

What's the best way to

  1. access directly an xml node (I'm responsible that the node will be unique)
  2. edit that node
  3. save changes to the xml

Thanks
Asaf

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

残龙傲雪 2024-09-22 13:56:19

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

将 XPath 与 El Padrino 的答案放在一起:

//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

You can use the same pattern as the first answer you linked to, but you will need to include the conditions on the attributes in the XPath. Your basic XPath would be g/page/row/pic. Since you want the no attribute of page to be 1, you add [@no='1'] as a predicate on page. So, the full XPath query is something like g/page[@no='1']/row/pic[@pos='1']. SelectSingleNode will return a mutable XmlNode object, so you can modify that object and save the original document to save changes.

Putting the XPath together with El Padrino's answer:

//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
十二 2024-09-22 13:56:19

使用精心设计的新 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);

Use the new, well-designed XDocument/XElement instead of the old XmlDocument API.

In your example,

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文