你好我有这个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;
}
请帮助我,我的代码中哪里出错?
答案 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;
}