سؤال

لقد وجدت بعض الأمثلة حول هذا الموضوع. بعض الأمثلة على طريقة لتعديل السمة مع SelectNodes() أو SelectSingleNode(), ، وغيرهم من الطريقة لتعديل السمة مع someElement.SetAttribute("attribute-name", "new value");

لكني ما زلت في حيرة من أمري كيفية بناء العلاقة إذا استخدمت فقط XpathNodeItterator it?

افترض أنني عرفت على النحو التالي ،

System.Xml.XPath.XPathDocument doc = new XPathDocument(xmlFile);
System.Xml.XPath.XPathNavigator nav = doc.CreateNavigator();
System.Xml.XPath.XPathNodeIterator it;

it = nav.Select("/Equipment/Items/SubItmes");
while (it.MoveNext())
{
   name = it.Current.GetAttribute("name ", it.Current.NamespaceURI);
   int vidFromXML = int.Parse(it.Current.GetAttribute("vid", it.Current.NamespaceURI));
   if (vidFromXML = vid)
   { 
    // How can I find the relation between it and element and node? I want to modify name attribute value. 
   }
}

هل هناك طريقة مثل it.setAttribute(name, "newValue") ?

هل كانت مفيدة؟

المحلول

من عند MSDN: "يتم إنشاء كائن XPathNavigator من فئة تنفذ الواجهة IxPathNavigable مثل فئات XPathDocument و XmlDocument. كائنات XPathnavigator التي تم إنشاؤها بواسطة كائنات XathPatrocument هي للقراءة فقط بينما يمكن تحرير كائنات XPathNavigator التي تم إنشاؤها بواسطة كائنات XMLDOCUMANT. يتم تحديد حالة كائن XPathNavigator للقراءة فقط أو القابلة للتحرير باستخدام خاصية Canedit لفئة XPathNavigator. "

لذلك ، أولاً وقبل كل شيء ، عليك استخدام XmlDocument ، وليس Xpathdocument ، إذا كنت ترغب في تعيين سمة.

مثال على كيفية تعديل بيانات XML باستخدام XPathNavigator باستخدام طريقة CreateNavigator لـ XMLDOCUMIT هنا.

كما سترى من المثال ، هناك طريقة setValue على كائن IT.Current الخاص بك.

إليك الطريقة التي ستفعل بها ذلك للرمز الخاص بك ، مع بعض التعديلات الطفيفة:

        int vid = 2;
        var doc = new XmlDocument();
        doc.LoadXml("<Equipment><Items><SubItems  vid=\"1\" name=\"Foo\"/><SubItems vid=\"2\" name=\"Bar\"/></Items></Equipment>");
        var nav = doc.CreateNavigator();

        foreach (XPathNavigator it in nav.Select("/Equipment/Items/SubItems"))
        {
            if(it.MoveToAttribute("vid", it.NamespaceURI)) {
                int vidFromXML = int.Parse(it.Value);                    
                if (vidFromXML == vid)
                {
                    // if(it.MoveToNextAttribute() ... or be more explicit like the following:

                    if (it.MoveToParent() && it.MoveToAttribute("name", it.NamespaceURI))
                    {
                        it.SetValue("Two");
                    } else {
                        throw new XmlException("The name attribute was not found.");
                    }                
                }
            } else {
                    throw new XmlException("The vid attribute was not found.");
            }
        }

نصائح أخرى

كتبت طريقة تمديد توفر ملف SetAttribute طريقة لأي XPathNavigator:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.XPath;

namespace My.Shared.Utilities {
    public static class XmlExtensions {
        public static void SetAttribute(this XPathNavigator nav, string localName, string namespaceURI, string value) {
            if (!nav.MoveToAttribute(localName, namespaceURI)) {
                throw new XmlException("Couldn't find attribute '" + localName + "'.");
            }
            nav.SetValue(value);
            nav.MoveToParent();
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top