我找到了一些有关此主题的示例。一些示例提供了使用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类)创建的。XPathDocument对象创建的XPathNavigator对象是只读的,而XmlDocument对象创建的XPathNavigator对象可以被编辑。XPathNavigator使用XPathNavigator类的CanEdit属性确定对象的只读或可编辑状态。”

因此,如果要设置属性,首先必须使用XmlDocument,而不是XPathDocument。

here显示了一个示例,该示例说明如何使用XPathDocument和XmlDocument的CreateNavigator方法使用XPathNavigator修改XML数据。

从示例中可以看到,在it.Current对象上有一个SetValue方法。

只需稍作修改,即可为代码执行以下操作:

        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.");
            }
        }

关于c# - 在C#中修改现有XML内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3623211/

10-10 02:08