操作XML问题

accpchenjun 2009-01-04 04:19:20
如何从数据库里读取一个日期列(2008/12/19) 并在现有XML文件里的"采集数据_DT"节点下生成

<Y2008>
<M1>
<D>2</D>
</M1>
</Y2008>
格式的节点

示例

<采集数据_DT>
<Y2008>
<M1>
<D>2</D>
</M1>
</Y2008>
<Y2005>
<M12>
<D>31</D>
</M12>
</Y2005>
<Y1983>
<M5>
<D>2</D>
<D>4</D>
</M5>
</Y1983>
</采集数据_DT>

...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hertz_liu 2009-01-05
  • 打赏
  • 举报
回复

我的XML是这样的:
<?xml version="1.0" encoding="utf-8"?>
<student>
<stu04550607>
<name>aaaaa</name>
<sex>male</sex>
</stu04550607>
<stu04550814>
<name>bbbbbbb</name>
<sex>female</sex>
</stu04550814>
</student>


我对它采取如下操作:
static void Read()
{
Console.WriteLine("学号 姓名 性别");
Console.WriteLine("----------------------------------------");

XmlDocument doc = new XmlDocument();
doc.Load(Url);
XmlNodeList nodelist = doc.SelectSingleNode(Student).ChildNodes;
foreach (XmlNode xn in nodelist)
{
XmlElement node = (XmlElement)xn;
string id = node.Name;
id = id.Substring(3, id.Length - 3);
string name = node.SelectSingleNode(Name).InnerText;
string sex = node.SelectSingleNode(Sex).InnerText;
Console.WriteLine(id + " " + name + " " + sex);
}
}

static void Write()
{
Console.Write("Please input ID:");
string input_id = Console.ReadLine();
input_id = Stu + input_id;

XmlDocument doc = new XmlDocument();
doc.Load(Url);
XmlNodeList nodelist = doc.SelectSingleNode(Student).ChildNodes;
foreach (XmlNode xn in nodelist)
{
XmlElement node = (XmlElement)xn;
string id = node.Name;
if (input_id.Equals(id))
{
Console.WriteLine("The StudentID is Exist!");
return;
}
}

Console.Write("Please input Name:");
string name = Console.ReadLine();
Console.Write("Please input Sex:");
string sex = Console.ReadLine();

XmlElement root = doc.DocumentElement;
XmlElement tagInfo = doc.CreateElement(input_id);
XmlElement tagName = doc.CreateElement(Name);
XmlElement tagSex = doc.CreateElement(Sex);
tagName.InnerText = name;
tagSex.InnerText = sex;
tagInfo.AppendChild(tagName);
tagInfo.AppendChild(tagSex);
root.AppendChild(tagInfo);
doc.Save(Url);
}

static void Modify()
{
Console.Write("Please input ID which you want Modify:");
string input_id = Console.ReadLine();
input_id = Stu + input_id;
bool flag = false;

XmlDocument doc = new XmlDocument();
doc.Load(Url);
XmlNodeList nodelist = doc.SelectSingleNode(Student).ChildNodes;
foreach (XmlNode xn in nodelist)
{
XmlElement node = (XmlElement)xn;
string id = node.Name;
if (input_id.Equals(id))
{
flag = true;
string name = node.SelectSingleNode(Name).InnerText;
string sex = node.SelectSingleNode(Sex).InnerText;
Console.WriteLine("The StudentInfo is:");
Console.WriteLine("-------------------");
Console.WriteLine("Name:" + name);
Console.WriteLine("Sex:" + sex);
Console.WriteLine();
Console.Write("Modify Name:");
string name1 = Console.ReadLine();
Console.Write("Modify Sex:");
string sex1 = Console.ReadLine();
node.SelectSingleNode(Name).InnerText = name1;
node.SelectSingleNode(Sex).InnerText = sex1;
doc.Save(Url);
Console.WriteLine("Update Successful!");
}
}

if (flag == false)
{
Console.WriteLine(NoData);
}
}

static void Search()
{
Console.Write("Please input ID which you want Search:");
string input_id = Console.ReadLine();
input_id = Stu + input_id;
bool flag = false;

XmlDocument doc = new XmlDocument();
doc.Load(Url);
XmlNodeList nodelist = doc.SelectSingleNode(Student).ChildNodes;
foreach (XmlNode xn in nodelist)
{
XmlElement node = (XmlElement)xn;
string id = node.Name;
if (input_id.Equals(id))
{
flag = true;
string name = node.SelectSingleNode(Name).InnerText;
string sex = node.SelectSingleNode(Sex).InnerText;
Console.WriteLine("The StudentInfo is:");
Console.WriteLine("-------------------");
Console.WriteLine("Name:" + name);
Console.WriteLine("Sex:" + sex);
}
}

if (flag == false)
{
Console.WriteLine(NoData);
}
}

static void Delete()
{
Console.Write("Please input ID which you want Delete:");
string input_id = Console.ReadLine();
input_id = Stu + input_id;
bool flag = false;

XmlDocument doc = new XmlDocument();
doc.Load(Url);
XmlNodeList nodelist = doc.SelectSingleNode(Student).ChildNodes;
foreach (XmlNode xn in nodelist)
{
XmlElement node = (XmlElement)xn;
string id = node.Name;
if (input_id.Equals(id))
{
flag = true;
doc.SelectSingleNode(Student).RemoveChild(node);
doc.Save(Url);
Console.WriteLine("Delete Successful!");
}
}

if (flag == false)
{
Console.WriteLine(NoData);
}
}
看看对你有没有帮助

Lee_Moon 2009-01-05
  • 打赏
  • 举报
回复
string xml = "<采集数据_DT>"
+ "<Y2008>"
+ "<M1>"
+ "<D>2 </D> "
+ "</M1>"
+ "</Y2008>"
+ "<Y2005>"
+ "<M12>"
+ "<D>31 </D>"
+ "</M12>"
+ "</Y2005>"
+ "<Y1983>"
+ "<M5>"
+ "<D>2 </D>"
+ "<D>4 </D>"
+ "</M5>"
+ "</Y1983>"
+ "</采集数据_DT> ";

string dat = "2008/12/19";
XmlDocument xdom = new XmlDocument();
xdom.LoadXml(xml);

XmlNode root = xdom.SelectSingleNode("//采集数据_DT");
// for (int i = 0; i < tb.Rows.Count; i++)
// {
//DataRow r = tb.Rows[i];
//temp = r["PubDate"].ToString().Split('/');
string[] temp = dat.Split('/');
string year = "Y" + temp[0];
string month = "M" + temp[1];
string day = temp[2];
XmlNodeList xnls = root.SelectNodes(year);
if(xnls.Count < 1)
root.InnerXml += "<" + year + "><" + month + "><d>" + day + "</d></" + month + "></" + year + ">";
else
{
XmlNode xn_year = xnls.Item(0);
XmlNodeList xn_months = xn_year.SelectNodes(month);
if(xn_months.Count < 1)
xn_year.InnerXml += "<" + month + "><d>" + day + "</d></" + month + ">";
else
{
XmlNode xn_month = xn_months.Item(0);
XmlNodeList xn_days = xn_month.ChildNodes;
foreach (XmlNode _n in xn_days)
{
if (_n.InnerText.Trim() == day)
{
break;
}
xn_month.InnerXml += "<D>" + day + "</D>";
}
}
}
--------

就这样 我把你的数据换了下。 我没好好测试 , 大致应该没错的。 你测试下。
accpchenjun 2009-01-05
  • 打赏
  • 举报
回复
5楼 我现在这个做法可以达上面到目的
doc.Load(path);
XmlNode root = doc.SelectSingleNode("//采集数据_DT");
for (int i = 0; i < tb.Rows.Count; i++)
{
DataRow r = tb.Rows[i];
temp = r["PubDate"].ToString().Split('/');
XmlNodeList temlist = root.ChildNodes;
root.InnerXml = string.Format("<Y{0}><M{1}><D>{2}</D></M{3}></Y{4}>", temp[0], temp[1], temp[2], temp[1], temp[0]);
}
doc.Save(path);
问题是 我在从数据库读出来生成XML文件时 就要把 同年 同月的加入同一节点下 我应该如何做
<Y1983>
<M5>
<D>1 </D>
<D>2 </D>
</M5>
</Y1983>
<Y1984>
<M5>
<D>1 </D>
<D>2 </D>
</M5>
</Y1983>
Lee_Moon 2009-01-05
  • 打赏
  • 举报
回复
不太了解你的需求
如果是 新增个 Y1983 的节点
可以先把 这个节点 字符串拼接起来。
然后
XmlNode xn = xdom.SelectSingleNode("采集数据_DT");
xn.InnerXml += "<Y1983><M5><D>2</D><D>4</D></M5></Y1983>";

我想你的意思应该是 在XML 原有的1983 这个节点里 新增个 月份的节点 和 天的节点吧。
上面做的 会 出现2个 1983的节点。

如果是这样 那就像 上面读XML 循环出 1983的节点 如果没有M5的节点 就添加 如果有 就进去 添加不存在的天的节点。
accpchenjun 2009-01-05
  • 打赏
  • 举报
回复
如何将 同年 同月的加入同一节点下 如下所示
<Y1983>
<M5>
<D>2 </D>
<D>4 </D>
</M5>
</Y1983>
sunshine_anycall 2009-01-04
  • 打赏
  • 举报
回复
好奇怪啊!
为什么要这样呢?
Lee_Moon 2009-01-04
  • 打赏
  • 举报
回复
string xml = "<采集数据_DT>"
+ "<Y2008>"
+ "<M1>"
+ "<D>2 </D> "
+ "</M1>"
+ "</Y2008>"
+ "<Y2005>"
+ "<M12>"
+ "<D>31 </D>"
+ "</M12>"
+ "</Y2005>"
+ "<Y1983>"
+ "<M5>"
+ "<D>2 </D>"
+ "<D>4 </D>"
+ "</M5>"
+ "</Y1983>"
+ "</采集数据_DT> ";

XmlDocument xdom = new XmlDocument();
xdom.LoadXml(xml);

DateTime dt = DateTime.Parse("2008/12/19");
string year = "Y" + dt.Year.ToString();
string month = "M" + dt.Month.ToString();



XmlNode xn = xdom.SelectSingleNode("采集数据_DT");
XmlNodeList xn1s = xn.SelectNodes(year)[0].ChildNodes;

foreach (XmlNode n in xn1s)
{
if (n.Name == month)
{
XmlNodeList ns = n.ChildNodes;
foreach (XmlNode _n in ns)
{
Response.Write(_n.InnerText);
}
}
}
}
wanghui0380 2009-01-04
  • 打赏
  • 举报
回复
这种设计是比较奇怪啊,我在想为啥没有属性呢?

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧