更新并保存xml节点

时间:2014-01-06 12:58:40

标签: c# .net xml

你好我有这个xml代码

    <AriaGostarInformation>
  <MenuInformation>
    <MenuNames Name="1">
      home
    </MenuNames>
    <MenuNames Name="2">
      pages
    </MenuNames>
    <MenuNames Name="3">
      blog
    </MenuNames>
    <MenuNames Name="4">
      gallery
    </MenuNames>
    <MenuNames Name="5">
      about us
    </MenuNames>
    <MenuNames Name="6">
    contact us
    </MenuNames>
    <SubMenuNames parentName="1">
      fgfgfgfgs
    </SubMenuNames>
    <SubMenuNames parentName="3">
    </SubMenuNames>
  </MenuInformation>
</AriaGostarInformation>

和c#代码:

public void updateXmlNodeWithAttribute(string XmlNodeName, string XmlAttributeName, List<string> XmlNodeAttribute, List<string> XmlNodeValue)
{
    XmlDocument xdoc = new XmlDocument();
    xdoc.Load(_connection);
    XmlNodeList xnode = getXmlNodeList(XmlNodeName);

    for (int i = 0; i < XmlNodeAttribute.Count - 1; i++)
    {
        foreach (XmlNode item in xnode)
        {
            if (item.Attributes[XmlAttributeName].Value == XmlNodeAttribute[i].ToString())
            {
                item.InnerText = XmlNodeValue[i].ToString();
            }
        }
    }

    xdoc.Save(_connection);
}

getXmlNodeList方法从XML文件返回指定的xmlnodelist

此代码不会引发错误,但不会更新XML节点。

public XmlNodeList getXmlNodeList(string XmlNodeName)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(_connection);
    XmlNodeList elemList = doc.GetElementsByTagName(XmlNodeName);
    return elemList;
}

请帮助我,我的代码中哪里出错?

1 个答案:

答案 0 :(得分:1)

我在你的代码中发现了两个问题。

第一个错误发生在for循环中。使用-1时,始终不使用List中的最后一个元素。或者,如果列表中只有一个元素,则永远不会执行for循环。

第二个问题是,您加载XML文件两次。第一次在updateXmlNodeWithAttribute方法中加载它。第二次在getXmlNodeList方法中加载它。

您必须知道每个加载的XML Document都独立于其他加载的XML Document。 那么你的代码所做的就是从getXmlNodeList方法中加载的XML文件中获取带有XML节点的List,编辑其中一个XML节点,然后尝试保存在updateXmlNodeWithAttribute方法中加载的XML Document,其中没有进行任何更改,因为两个XML文档是完全独立的。

所以你要做的就是在两种方法中使用相同的XmlDocument对象。 请参阅下面的代码。

public static void updateXmlNodeWithAttribute(string XmlNodeName, string XmlAttributeName, List<string> XmlNodeAttribute, List<string> XmlNodeValue)
    {
        XmlDocument xdoc = new XmlDocument();
        xdoc.Load(_connection);
        XmlNodeList xnode = getXmlNodeList(XmlNodeName,xdoc);

        for (int i = 0; i < XmlNodeAttribute.Count; i++)
        {
            foreach (XmlNode item in xnode)
            {
                if (item.Attributes[XmlAttributeName].Value == XmlNodeAttribute[i].ToString())
                {
                    item.InnerText = XmlNodeValue[i].ToString();
                }
            }
        }

        xdoc.Save(_connection);
    }

    public static XmlNodeList getXmlNodeList(string XmlNodeName, XmlDocument doc)
    {
        XmlNodeList elemList = doc.GetElementsByTagName(XmlNodeName);
        return elemList;
    }