积极答复者
【C#】C#如何为XML中的某一节点添加注释呢?

问题
答案
-
参考:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("XMLFile1.xml");
//Find the node
XmlNode node = doc.SelectSingleNode("//br");
//Do Insert the comment before
XmlComment comment = doc.CreateComment("this is a sample thing");
node.ParentNode.InsertBefore(comment, node);
doc.Save("c:\\try.xml");
}[The original xml file is]
<root> <a>This is a sample</a> <br>aaa</br> </root>
- 已建议为答案 ThankfulHeartModerator 2012年7月6日 7:58
- 已标记为答案 jinwb1982 2012年7月6日 9:16
-
你好添加注释已经解决,代码如下:
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/xml/test.xml"));
XmlNode rootElement = doc.SelectSingleNode("//root");
XmlNodeList xnl = doc.SelectSingleNode("//root").ChildNodes;
for (int i = 0; i < xnl.Count; i++)
{
XmlNode xe = xnl.Item(i);
if (((XmlElement)xe).GetAttribute("name") == "1")
{
XmlDocumentFragment inxml = doc.CreateDocumentFragment();
inxml.InnerText = "<!--";
xe.ParentNode.InsertBefore(inxml, xe);
inxml.InnerText = "-->";
xe.ParentNode.InsertAfter(inxml, xe);
break;
}
}感谢你的帮助!
煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
- 已标记为答案 jinwb1982 2012年7月6日 9:16
-
我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。
参考:
- public class MainTest
- {
- static void Main(string[] args)
- {
- XmlDocument doc = new XmlDocument();
- doc.Load("XMLFile1.xml");
- //读取注释的内容
- string s = doc.DocumentElement.FirstChild.InnerText;
- //解析其xml内容
- XmlDocument tdoc = new XmlDocument();
- tdoc.LoadXml(s);
- //删除原来的内容
- doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
- //重新添加
- XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
- ele.InnerText = tdoc.InnerText;
- doc.DocumentElement.AppendChild(ele);
- doc.Save("c:\\try.xml");
- }
- }
【原来的xml】
- <?xml version="1.0" encoding="utf-8" ?>
- <Root>
- <!--<a>This is a sample</a>-->
- </Root>
顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!
- 已编辑 ThankfulHeartModerator 2012年7月8日 4:33
- 已标记为答案 jinwb1982 2012年7月10日 9:00
-
我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。
参考:
- public class MainTest
- {
- static void Main(string[] args)
- {
- XmlDocument doc = new XmlDocument();
- doc.Load("XMLFile1.xml");
- //读取注释的内容
- string s = doc.DocumentElement.FirstChild.InnerText;
- //解析其xml内容
- XmlDocument tdoc = new XmlDocument();
- tdoc.LoadXml(s);
- //删除原来的内容
- doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
- //重新添加
- XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
- ele.InnerText = tdoc.InnerText;
- doc.DocumentElement.AppendChild(ele);
- doc.Save("c:\\try.xml");
- }
- }
【原来的xml】
- <?xml version="1.0" encoding="utf-8" ?>
- <Root>
- <!--<a>This is a sample</a>-->
- </Root>
顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!
你好,研究了一下午。终于解决了。感谢你的帮助。代码如下:
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/xml/test.xml"));
string allxml = doc.OuterXml;//xe.OuterXml;
XmlTextReader reader = new XmlTextReader(Server.MapPath("~/xml/test.xml"));
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Comment) //注释内容
{
string vv = reader.Value;//<a name=\"1\">This is a sample</a>
//xmlDoc = new XmlDocument();
doc.LoadXml(vv); //装载xml
XmlNode xNode = doc.SelectSingleNode("//a");
string strValue = xNode.Attributes[0].Value;
if (strValue == "1") //若与数据库数值相同
{
string repstr = "<!--" + vv + "-->";
allxml = allxml.Replace(repstr, vv);
}
doc.LoadXml(allxml);
doc.Save("c:\\try.xml");
break;
}
}煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
- 已标记为答案 ThankfulHeartModerator 2012年7月9日 2:16
全部回复
-
参考:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("XMLFile1.xml");
//Find the node
XmlNode node = doc.SelectSingleNode("//br");
//Do Insert the comment before
XmlComment comment = doc.CreateComment("this is a sample thing");
node.ParentNode.InsertBefore(comment, node);
doc.Save("c:\\try.xml");
}[The original xml file is]
<root> <a>This is a sample</a> <br>aaa</br> </root>
- 已建议为答案 ThankfulHeartModerator 2012年7月6日 7:58
- 已标记为答案 jinwb1982 2012年7月6日 9:16
-
参考:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("XMLFile1.xml");
//Find the node
XmlNode node = doc.SelectSingleNode("//br");
//Do Insert the comment before
XmlComment comment = doc.CreateComment("this is a sample thing");
node.ParentNode.InsertBefore(comment, node);
doc.Save("c:\\try.xml");
}[The original xml file is]
<root> <a>This is a sample</a> <br>aaa</br> </root>
你好,感谢你的帮助,但是有一个问题,就是只在前面添加了"<!--" 那么该节点的后面难道利用InsertAfter添加吗?我的这个问题使用的是循环遍历节点,如果查出数据的话,我发现插入的数据是譬如<!-- 这样的形式,程序会误认为是节点,那么在循环中就造成了不准确。这样如何解决呢?
煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
- 已编辑 jinwb1982 2012年7月4日 8:59
-
>>如果查出数据的话,我发现插入的数据是譬如<!-- 这样的形式,程序会误认为是节点,那么在循环中就造成了不准确。这样如何解决呢?
应该不会吧?这是注释,会被自动忽略的;好比说你用C#写代码,编译的时候编译器是忽略的。XD
我再给你一个例子:
InsertBefore(要插入的节点,原有的节点); //在原有节点处插入节点
假设你的Xml文件:
<root> <a>This is a sample</a> <b>aaa</b> <c>This is a sample</c> <d>aaa</d> </root>
我循环插入,请看好:
public class MainTest { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); //Find the node foreach (XmlNode item in doc.DocumentElement.ChildNodes) { XmlComment comNode = doc.CreateComment("This is a "+item.InnerText); doc.DocumentElement.InsertBefore(comNode, item); } doc.Save("C:\\try.xml"); //重新遍历输出节点内容 doc.Load("C:\\try.xml"); foreach (XmlNode item in doc.DocumentElement.ChildNodes) { if (item.NodeType == XmlNodeType.Element) { Console.WriteLine(item.InnerText); } } } }
- 已建议为答案 Mike FengModerator 2012年7月5日 9:05
- 取消建议作为答案 jinwb1982 2012年7月6日 4:33
- 已建议为答案 ThankfulHeartModerator 2012年7月6日 7:58
-
>>如果查出数据的话,我发现插入的数据是譬如<!-- 这样的形式,程序会误认为是节点,那么在循环中就造成了不准确。这样如何解决呢?
应该不会吧?这是注释,会被自动忽略的;好比说你用C#写代码,编译的时候编译器是忽略的。XD
我再给你一个例子:
InsertBefore(要插入的节点,原有的节点); //在原有节点处插入节点
假设你的Xml文件:
<root> <a>This is a sample</a> <b>aaa</b> <c>This is a sample</c> <d>aaa</d> </root>
我循环插入,请看好:
public class MainTest { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); //Find the node foreach (XmlNode item in doc.DocumentElement.ChildNodes) { XmlComment comNode = doc.CreateComment("This is a "+item.InnerText); doc.DocumentElement.InsertBefore(comNode, item); } doc.Save("C:\\try.xml"); //重新遍历输出节点内容 doc.Load("C:\\try.xml"); foreach (XmlNode item in doc.DocumentElement.ChildNodes) { if (item.NodeType == XmlNodeType.Element) { Console.WriteLine(item.InnerText); } } } }
你好,结合你的实例我做了一个试验,其中发现了一个问题。如果在节点后面加入注释的话会出现System.OutOfMemoryException异常。请问你也是这样的吗?我的XP系统32位的,内存2GB,更奇怪的是在前面加就没有问题,这是什么原因呢?请指教,谢谢!
煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
- 已编辑 jinwb1982 2012年7月6日 4:31
-
确实很奇怪,不是很清楚原因,不过这个方法可行:
public class MainTest { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); //Find the node for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++) { if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Element) { doc.DocumentElement.InsertAfter(doc.CreateComment("See this!"), doc.DocumentElement.ChildNodes[i]); } } doc.Save("c:\\try.xml"); } }
-
确实很奇怪,不是很清楚原因,不过这个方法可行:
public class MainTest { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); //Find the node for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++) { if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Element) { doc.DocumentElement.InsertAfter(doc.CreateComment("See this!"), doc.DocumentElement.ChildNodes[i]); } } doc.Save("c:\\try.xml"); } }
你好!如果是某一个节点前后都插入呢?其实我的意思是想注释掉一个节点 比如:<!--<d>aaa</d>--> 结合你给的例子,把这个d节点注释掉煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
-
namespace CSharp { public class MainTest { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++) { if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Comment) { //转化成标准的xml string value = doc.DocumentElement.ChildNodes[i].InnerText; //解析为xml XmlDocument tdoc = new XmlDocument(); tdoc.LoadXml(value); doc.DocumentElement.RemoveChild(doc.DocumentElement.ChildNodes[i]); //转化为xml节点插入 XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null); ele.InnerText = tdoc.DocumentElement.InnerText; doc.DocumentElement.AppendChild(ele); i--; } } doc.Save("c:\\try.xml"); } } }
假设你的xml:
<root> <!--<b>This is a sample</b> --> </root>
- 已建议为答案 ThankfulHeartModerator 2012年7月6日 7:58
-
namespace CSharp { public class MainTest { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); for (int i = 0; i < doc.DocumentElement.ChildNodes.Count; i++) { if (doc.DocumentElement.ChildNodes[i].NodeType == XmlNodeType.Comment) { //转化成标准的xml string value = doc.DocumentElement.ChildNodes[i].InnerText; //解析为xml XmlDocument tdoc = new XmlDocument(); tdoc.LoadXml(value); doc.DocumentElement.RemoveChild(doc.DocumentElement.ChildNodes[i]); //转化为xml节点插入 XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null); ele.InnerText = tdoc.DocumentElement.InnerText; doc.DocumentElement.AppendChild(ele); i--; } } doc.Save("c:\\try.xml"); } } }
假设你的xml:
<root> <!--<b>This is a sample</b> --> </root>
你好,经过测试发现还是有问题的,提示错误根级别上的数据无效。 问题是出在tdoc.LoadXml(value); 这个程序我看了一下,之前如果有<!-- -->这样的测试好说,如果没有注释,某节点添加注释呢?煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
-
>>如果没有注释,某节点添加注释呢?
这个问题就是添加节点,请不要和“删除注释节点”混淆!请仔细看我上文的内容,自己动脑子想想。:D
不好意思,可能是我表达不清楚,其实就是想把XML文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<a >This is a sample</a>
<b>aaa</b>
<c>This is a sample</c>
<d>aaa</d>
</root>把 <a >This is a sample</a> 注释掉就可以了
煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
-
你好添加注释已经解决,代码如下:
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/xml/test.xml"));
XmlNode rootElement = doc.SelectSingleNode("//root");
XmlNodeList xnl = doc.SelectSingleNode("//root").ChildNodes;
for (int i = 0; i < xnl.Count; i++)
{
XmlNode xe = xnl.Item(i);
if (((XmlElement)xe).GetAttribute("name") == "1")
{
XmlDocumentFragment inxml = doc.CreateDocumentFragment();
inxml.InnerText = "<!--";
xe.ParentNode.InsertBefore(inxml, xe);
inxml.InnerText = "-->";
xe.ParentNode.InsertAfter(inxml, xe);
break;
}
}感谢你的帮助!
煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
- 已标记为答案 jinwb1982 2012年7月6日 9:16
-
哦,那你应该说——把一个xml节点注释掉。
那么:
public class MainTest { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); //保留第一个节点内容 string value = doc.DocumentElement.FirstChild.OuterXml; //删除第一个节点 doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild); //重新添加 XmlComment com = doc.CreateComment(value); doc.DocumentElement.InsertBefore(com, doc.DocumentElement.FirstChild); doc.Save("c:\\try.xml"); } }
希望下次一次性说清问题就好咯……不然你就直接上代码和你的意图,我看看你要干啥?谢谢! -
好的好的,谢谢了!能引申一个问题吗?结合你的例子,如果注释以后,如何才能删除呢?
煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
请给出你的xml代码以及标记出来你要删除什么,谢谢。你的话我实在不懂。
- 已编辑 ThankfulHeartModerator 2012年7月7日 5:11
-
我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。
参考:
- public class MainTest
- {
- static void Main(string[] args)
- {
- XmlDocument doc = new XmlDocument();
- doc.Load("XMLFile1.xml");
- //读取注释的内容
- string s = doc.DocumentElement.FirstChild.InnerText;
- //解析其xml内容
- XmlDocument tdoc = new XmlDocument();
- tdoc.LoadXml(s);
- //删除原来的内容
- doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
- //重新添加
- XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
- ele.InnerText = tdoc.InnerText;
- doc.DocumentElement.AppendChild(ele);
- doc.Save("c:\\try.xml");
- }
- }
【原来的xml】
- <?xml version="1.0" encoding="utf-8" ?>
- <Root>
- <!--<a>This is a sample</a>-->
- </Root>
顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!
- 已编辑 ThankfulHeartModerator 2012年7月8日 4:33
- 已标记为答案 jinwb1982 2012年7月10日 9:00
-
我不明白——你既然不需要标记,为什么还要注释呢?你不是废话吗?一开始不要注释就好了。
参考:
- public class MainTest
- {
- static void Main(string[] args)
- {
- XmlDocument doc = new XmlDocument();
- doc.Load("XMLFile1.xml");
- //读取注释的内容
- string s = doc.DocumentElement.FirstChild.InnerText;
- //解析其xml内容
- XmlDocument tdoc = new XmlDocument();
- tdoc.LoadXml(s);
- //删除原来的内容
- doc.DocumentElement.RemoveChild(doc.DocumentElement.FirstChild);
- //重新添加
- XmlElement ele = doc.CreateElement(null, tdoc.DocumentElement.LocalName, null);
- ele.InnerText = tdoc.InnerText;
- doc.DocumentElement.AppendChild(ele);
- doc.Save("c:\\try.xml");
- }
- }
【原来的xml】
- <?xml version="1.0" encoding="utf-8" ?>
- <Root>
- <!--<a>This is a sample</a>-->
- </Root>
顺便说一声:一个帖子不要问那么多问题,请尊重别人的回答,把我的上面全部回答的答案给标记了,因为你没有问清楚!!!
你好,研究了一下午。终于解决了。感谢你的帮助。代码如下:
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/xml/test.xml"));
string allxml = doc.OuterXml;//xe.OuterXml;
XmlTextReader reader = new XmlTextReader(Server.MapPath("~/xml/test.xml"));
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Comment) //注释内容
{
string vv = reader.Value;//<a name=\"1\">This is a sample</a>
//xmlDoc = new XmlDocument();
doc.LoadXml(vv); //装载xml
XmlNode xNode = doc.SelectSingleNode("//a");
string strValue = xNode.Attributes[0].Value;
if (strValue == "1") //若与数据库数值相同
{
string repstr = "<!--" + vv + "-->";
allxml = allxml.Replace(repstr, vv);
}
doc.LoadXml(allxml);
doc.Save("c:\\try.xml");
break;
}
}煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com
- 已标记为答案 ThankfulHeartModerator 2012年7月9日 2:16