2014-01-06 29 views
0

你好,我有这样的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#代码:从XML文件

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方法返回指定的XmlNodeList

此代码不会抛出一个错误,但不会更新XML节点。

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

请帮助我在我的代码中出现错误?

+0

发布所有代码,包括'getXmlNodeList'。内循环是否至少执行一次?最里面的'if'是否匹配?你是否在调试器中执行它,该任务是否至少执行过一次? –

+0

@RemusRusanu我编辑后 – user3054913

回答

1

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

第一个错误出现在您的for循环中。使用-1时,列表中的最后一个元素始终未被使用。或者,如果您的列表中只有一个元素,则for循环从不执行。

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

您必须知道每个加载的XML文档都独立于其他加载的XML文档。 因此,您的代码执行的操作是从getXmlNodeList方法中加载的XML文件中获取XML节点的列表,编辑其中一个XML节点,然后尝试保存在未更改的updateXmlNodeWithAttribute方法中加载的XML文档,因为这两个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; 
    }