2014-01-06 116 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; 
    }