求c#的熟悉xml的高手指教,小弟第一次接触

时间:2023-02-22 09:59:41
<?xml version="1.0" encoding="utf-8" ?> 
<urlset>
    <url>
        <loc>http://jobs.zhaopin.com/P5/CC0000/1824/J902/500/CC000018244J90250002000.htm</loc> 
        <lastmod>2010-04-06</lastmod> 
        <changefreq>always</changefreq> 
        <priority>1.0</priority> 
        <data>
            <display>
                <title><![CDATA[ HPSW-Senior R&D Manager-Shanghai]]></title>
                <expirationdate>2011-01-17</expirationdate> 
                <description><![CDATA[ HP is a leading global provider of products, technologies, solutions and services to consumers and business. 
The company's offerings span IT infrastructure, personal computing and access devices, global services, and printing. 
Our $4 billion annual R&D investment fuels the invention of products, solutions and new technologies. 
We invent, engineer that drive business value, improve the lives of our customers. ]]></description>
                <type>社会招聘</type> 
                <city>上海</city> 
                <employer><![CDATA[ 惠普公司]]></employer>
                <email><![CDATA[ https://hp.taleo.net/careersection/2/jobdetail.ftl?lang=en&job=1720103&media_id=1009&src=Zhaopin]]></email>
                <jobfirstclass><![CDATA[ 计算机软、硬件/互联网/IT]]></jobfirstclass>
                <jobsecondclass><![CDATA[ 高级软件工程师]]></jobsecondclass>
                <education>本科</education> 
                <experience>5年以上</experience> 
                <startdate>2010-04-05</startdate> 
                <enddate>2011-01-17</enddate> 
                <salary>面议</salary> 
                <industry><![CDATA[ IT服务(系统/数据/维护)/多领域经营,计算机硬件及网络设备]]></industry>
                <employertype>合资</employertype> 
                <source>智联招聘</source>
                <sourcelink><![CDATA[http://www.zhaopin.com/]]></sourcelink>
            </display>
        </data>
    </url>
  
    <url>
        <loc>http://jobs.zhaopin.com/P2/CC1204/9901/J902/501/CC120499019J90250131000.htm</loc>
        <lastmod>2010-05-13</lastmod>
        <changefreq>always</changefreq>
        <priority>1.0</priority>
        <data>
                <display>
                <title><![CDATA[城市销售代表(温州/宁波)]]></title>
                <expirationdate>2010-07-25</expirationdate>
                <description><![CDATA[岗位职责:分别负责东芝宏碁产品温州及周边和宁波及周边区域销售,包括该品牌数码港,4-6级指标销售。
岗位要求:
1,本科以上,一年以上IT或快销销售经验,有渠道和区域销售经验者优先考虑;
2,本科以上,一年以上IT或快销销售经验,有渠道和区域销售经验者优先考虑]]></description>
                <type>社会招聘</type>
                <city>宁波</city>
                <employer><![CDATA[杭州神州数码有限公司]]></employer>
                <email><![CDATA[]]></email>
                <jobfirstclass><![CDATA[销售业务]]></jobfirstclass>
                <jobsecondclass><![CDATA[渠道/分销专员]]></jobsecondclass>
                <education>本科</education>
                <experience>1-3年</experience>
                <startdate>2010-05-13</startdate>
                <enddate>2010-07-25</enddate>
                <salary>1000-50000元/月</salary>
                <industry><![CDATA[计算机硬件及网络设备,计算机软件,IT服务(系统/数据/维护)/多领域经营,通讯(设备/运营/增值服务)]]></industry>
                <employertype>合资</employertype>
                <source>智联招聘</source>
                <sourcelink><![CDATA[http://www.zhaopin.com/]]></sourcelink>
            </display>
        </data>
    </url>
  
    <url>
    ...
    </url>

    ...

</urlset>


首先看生成的xml   格式如上图

然后看数据表中的字段
字段名  字段内容 
urlset  只需填写urlset 
url  具体某一个链接的定义入口,每一条数据都要用包含在里面 
loc  描述详细信息页面URL地址 
lastmod  用来指定该文件的最后更新时间,时间格式为:2010-09-10 
changefreq  标识页面可能会出现的更新频率
有效值为:always, hourly,daily,weekly,mothly,yearly,never 
priority  标识此网页的优先级。有效值范围从 0.0 到 1.0 
title  职位名称 
description  职位描述,内容可以为空,
内容为普通文本。
文本内可以换行,但不
得包含字体,字号,间距等
格式定义标签。 
city  工作地点
正确格式如“佛山”、“佛山市” 
employer  公司名称 
education  学历要求,如“大专”,“本科”等。
若无要求请填写“不限”
不得为空。 
experience  工作经验要求。如“3-5年”,“2年以上”。
若无要求请填写“不限”
不得为空。 
startdate  职位信息发布日期。格式:2010-02-16 
enddate  职位信息截止日期。格式:2010-02-24 
salary  薪资要求,可为以下3种格式
1)“面议”
2)“aaaa-bbbb元”
3)“aaaa元”
不得为空 
type  工作性质(实习、兼职、校招等) 
industry  公司所属行业。如“IT”,“金融”等 
jobfirstclass  职位大类,如“销售” 
jobsecondclass  职位小类,如“销售代表”,“电话销售” 
email  公司联系Email 
expirationdate  职位信息发布的结束日期
格式:2009-12-22 
employertype  公司性质。如“国企”,“私企”等 
source  网站名称,如“智联招聘” 
sourcelink  网站url,如“www.zhaopin.com” 






可以看出,xml每一个根节点,子节点都是从数据库表里读取出来的


 XmlDocument xmlDoc = new XmlDocument();
            XmlDeclaration dec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
            xmlDoc.AppendChild(dec);
            XmlElement root = xmlDoc.CreateElement("urlset");
            xmlDoc.AppendChild(root);
            XmlNode url = xmlDoc.CreateElement("url");
            root.AppendChild(url);
           然后用此方法添加所有节点

至于   cdata
XmlNode miaoshu = xmlDoc.CreateCDataSection("这里是描述.......");
            description.AppendChild(miaoshu);
用的是这类增加
最后,生成xml
 xmlDoc.Save(dir+"ss.xml");


好了,现在问题来了!!!
我现在要读取数据库表,把表里的所有公司的招聘信息都导出到xml
我的想法是,每个节点使用变量=数据库表字段,每个节点的内容用innertext方法添加,把字段里的内容赋值到变量中插入节点
但是,实践并没有想象的那么简单
有没有大虾做过类似的,指教一下小弟,万分感激!!!
越详细越好!!!
从查找字段到赋值到输出到xml,越详细越好
urlset根节点,然后每一个url节点都是一家公司的招聘信息
唉,小弟不才,头都快爆了
求大侠
求相关源码

11 个解决方案

#1


夜深了。。太长了没有看完。

XML基本操作会吗?

#2


测试数据

use testdb

create table company
(
loc nvarchar(255),
lastmod nvarchar(255)
)
insert into company
select 'http://111.htm','2010-04-06' union all
select 'http://222.htm','2010-04-07' union all
select 'http://333.htm','2010-04-08'


相关代码

using (SqlConnection conn = new SqlConnection("server=.;user id=sa;pwd=111;database=testdb;"))
{
    conn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "select * from company";
    cmd.Connection = conn;
    SqlDataReader dr = cmd.ExecuteReader();

    XDocument document = new XDocument();
    XElement root = new XElement("urlset");

    while (dr.Read())
    {
        XElement element = new XElement("url");
        element.Add(new XElement(dr.GetName(0), dr.GetValue(0)), new XElement(dr.GetName(1), dr.GetValue(1)));
        root.Add(element);
    }
    document.Add(root);
    document.Save(Server.MapPath("~/test.xml"));
}


结果:

<?xml version="1.0" encoding="utf-8"?>
<urlset>
  <url>
    <loc>http://111.htm</loc>
    <lastmod>2010-04-06</lastmod>
  </url>
  <url>
    <loc>http://222.htm</loc>
    <lastmod>2010-04-07</lastmod>
  </url>
  <url>
    <loc>http://333.htm</loc>
    <lastmod>2010-04-08</lastmod>
  </url>
</urlset>


测试数据库为testdb,数据库连接字符串修改成你自己的...

操作XML用的是LINQ TO XML,需引用System.Xml.Linq

这里只弄了两个字段,其余字段你自己处理。。。。

#3


先帮LZ顶,明天再看

#5


大家们都这么晚睡觉

#6


2楼的不错,用了linq
但是,我现在迷惑了
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=pp;Integrated Security=True");
        string zhujiedian = "select loc,lastmod,changefreq,priority,data from pp";
        conn.Open();
       
            SqlCommand cmd = new SqlCommand(zhujiedian,conn);
            SqlDataReader dr = cmd.ExecuteReader();
            XDocument document = new XDocument();
            XElement root = new XElement("urlset");
            while (dr.Read())
            {
                XElement element = new XElement("url");
                for (int i = 0; i < dr.FieldCount; i++)
                {
                    element.Add(new XElement(dr.GetName(i), dr.GetValue(i)));
                }
                root.Add(element);
            }
            document.Add(root);
            document.Save(@"c:\test.xml");


这代码可以很方便的生成主要的节点,但是,问题来了,先给看一下现在的xml
<?xml version="1.0" encoding="utf-8" ?> 
- <urlset>
- <url>
  <loc>http://jobs.zhaopin.com/P5/CC0000/1824/J902/500/CC000018244J90250002000.htm</loc> 
  <lastmod>2010-04-06</lastmod> 
  <changefreq>always</changefreq> 
  <priority>1.0</priority> 
  <data /> 
  </url>
</urlset>

data节需要插入很多信息,还要增加CDATA
效果如图
- <data>
- <display>
- <title>
- <![CDATA[  HPSW-Senior R&D Manager-Shanghai
  ]]> 
  </title>
  <expirationdate>2011-01-17</expirationdate> 
- <description>
- <![CDATA[ 
 HP is a leading global provider of products, technologies, solutions and services to consumers and business. 
The company's offerings span IT infrastructure, personal computing and access devices, global services, and printing. 
Our $4 billion annual R&D investment fuels the invention of products, solutions and new technologies. 
We invent, engineer that drive business value, improve the lives of our customers. 

  ]]> 
  </description>
  <type>社会招聘</type> 
  <city>上海</city> 
- <employer>
- <![CDATA[  惠普公司
  ]]> 
  </employer>
- <email>
- <![CDATA[  https://hp.taleo.net/careersection/2/jobdetail.ftl?lang=en&job=1720103&media_id=1009&src=Zhaopin
  ]]> 
  </email>
- <jobfirstclass>
- <![CDATA[  计算机软、硬件/互联网/IT
  ]]> 
  </jobfirstclass>
- <jobsecondclass>
- <![CDATA[  高级软件工程师
  ]]> 
  </jobsecondclass>
  <education>本科</education> 
  <experience>5年以上</experience> 
  <startdate>2010-04-05</startdate> 
  <enddate>2011-01-17</enddate> 
  <salary>面议</salary> 
- <industry>
- <![CDATA[  IT服务(系统/数据/维护)/多领域经营,计算机硬件及网络设备
  ]]> 
  </industry>
  <employertype>合资</employertype> 
  <source>智联招聘</source> 
- <sourcelink>
- <![CDATA[ http://www.zhaopin.com/
  ]]> 
  </sourcelink>
  </display>
  </data>

我该怎么去把这些信息插入到data节点里呢?

#7


最简单的办法 直接把数据处理下  包裹下下呗,
string data="<![CDATA[ "+data+"]]> ";
OK

#8


引用 6 楼 pinhao89 的回复:
2楼的不错,用了linq
但是,我现在迷惑了C# code
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=pp;Integrated Security=True");
        string zhujiedian = "select loc,lastmod,changefreq,priorit……


01 string myXml =
02 @"<!--?xml version='1.0' encoding='utf-8'?-->
03 <workingset>
04  <data>
05  </data>
06 </workingset>";
07  
08 XmlDocument doc1 = new XmlDocument();
09  
10 doc1.LoadXml(myXml);
11  
12 XmlNode target = doc1.SelectSingleNode("WorkingSet/Data");
13  
14 if (target != null)
15 target.AppendChild(doc1.CreateCDataSection("
16 <customertag>Hello</customertag>
17 "));

使用 XDocument
view source
print?
1 XDocument doc = XDocument.Parse(myXml, LoadOptions.SetLineInfo);
2  
3 XElement dataNode = doc.Descendants("Data").First();
4  
5 dataNode.Add(new XCData("
6  
7 <customertag>Hello</customertag>
8  
9 Console.WriteLine(doc.ToString());

結果
view source
print?
1 <!--?xml version="1.0" encoding="utf-8"?-->
2 <workingset>
3  <data><!--[CDATA[<customertag-->Hello]]></data>
4 </workingset>

#9


你想把SQL Server数据库中的信息,查询出来,然后以XML文档保存?据我所知,直接用SQL Server数据库里面的函数转换,或者在.NET里面编程select数据后,构造xml文档。若你需要限制每个element的值类型和范围的话,应该需要*.xsd文件限制你生成的xml文档吧。

#10


引用 6 楼 pinhao89 的回复:
2楼的不错,用了linq
但是,我现在迷惑了

C# code
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=pp;Integrated Security=True");
        string zhujiedian = "select loc,lastmod,changefreq,pri……

一条url节点难点,难道会有两条data节点? 看你的数据表结构,不应该把,

你直接用title这些节点呗,把data节点去掉

#11


难点 去掉

#1


夜深了。。太长了没有看完。

XML基本操作会吗?

#2


测试数据

use testdb

create table company
(
loc nvarchar(255),
lastmod nvarchar(255)
)
insert into company
select 'http://111.htm','2010-04-06' union all
select 'http://222.htm','2010-04-07' union all
select 'http://333.htm','2010-04-08'


相关代码

using (SqlConnection conn = new SqlConnection("server=.;user id=sa;pwd=111;database=testdb;"))
{
    conn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "select * from company";
    cmd.Connection = conn;
    SqlDataReader dr = cmd.ExecuteReader();

    XDocument document = new XDocument();
    XElement root = new XElement("urlset");

    while (dr.Read())
    {
        XElement element = new XElement("url");
        element.Add(new XElement(dr.GetName(0), dr.GetValue(0)), new XElement(dr.GetName(1), dr.GetValue(1)));
        root.Add(element);
    }
    document.Add(root);
    document.Save(Server.MapPath("~/test.xml"));
}


结果:

<?xml version="1.0" encoding="utf-8"?>
<urlset>
  <url>
    <loc>http://111.htm</loc>
    <lastmod>2010-04-06</lastmod>
  </url>
  <url>
    <loc>http://222.htm</loc>
    <lastmod>2010-04-07</lastmod>
  </url>
  <url>
    <loc>http://333.htm</loc>
    <lastmod>2010-04-08</lastmod>
  </url>
</urlset>


测试数据库为testdb,数据库连接字符串修改成你自己的...

操作XML用的是LINQ TO XML,需引用System.Xml.Linq

这里只弄了两个字段,其余字段你自己处理。。。。

#3


先帮LZ顶,明天再看

#4


#5


大家们都这么晚睡觉

#6


2楼的不错,用了linq
但是,我现在迷惑了
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=pp;Integrated Security=True");
        string zhujiedian = "select loc,lastmod,changefreq,priority,data from pp";
        conn.Open();
       
            SqlCommand cmd = new SqlCommand(zhujiedian,conn);
            SqlDataReader dr = cmd.ExecuteReader();
            XDocument document = new XDocument();
            XElement root = new XElement("urlset");
            while (dr.Read())
            {
                XElement element = new XElement("url");
                for (int i = 0; i < dr.FieldCount; i++)
                {
                    element.Add(new XElement(dr.GetName(i), dr.GetValue(i)));
                }
                root.Add(element);
            }
            document.Add(root);
            document.Save(@"c:\test.xml");


这代码可以很方便的生成主要的节点,但是,问题来了,先给看一下现在的xml
<?xml version="1.0" encoding="utf-8" ?> 
- <urlset>
- <url>
  <loc>http://jobs.zhaopin.com/P5/CC0000/1824/J902/500/CC000018244J90250002000.htm</loc> 
  <lastmod>2010-04-06</lastmod> 
  <changefreq>always</changefreq> 
  <priority>1.0</priority> 
  <data /> 
  </url>
</urlset>

data节需要插入很多信息,还要增加CDATA
效果如图
- <data>
- <display>
- <title>
- <![CDATA[  HPSW-Senior R&D Manager-Shanghai
  ]]> 
  </title>
  <expirationdate>2011-01-17</expirationdate> 
- <description>
- <![CDATA[ 
 HP is a leading global provider of products, technologies, solutions and services to consumers and business. 
The company's offerings span IT infrastructure, personal computing and access devices, global services, and printing. 
Our $4 billion annual R&D investment fuels the invention of products, solutions and new technologies. 
We invent, engineer that drive business value, improve the lives of our customers. 

  ]]> 
  </description>
  <type>社会招聘</type> 
  <city>上海</city> 
- <employer>
- <![CDATA[  惠普公司
  ]]> 
  </employer>
- <email>
- <![CDATA[  https://hp.taleo.net/careersection/2/jobdetail.ftl?lang=en&job=1720103&media_id=1009&src=Zhaopin
  ]]> 
  </email>
- <jobfirstclass>
- <![CDATA[  计算机软、硬件/互联网/IT
  ]]> 
  </jobfirstclass>
- <jobsecondclass>
- <![CDATA[  高级软件工程师
  ]]> 
  </jobsecondclass>
  <education>本科</education> 
  <experience>5年以上</experience> 
  <startdate>2010-04-05</startdate> 
  <enddate>2011-01-17</enddate> 
  <salary>面议</salary> 
- <industry>
- <![CDATA[  IT服务(系统/数据/维护)/多领域经营,计算机硬件及网络设备
  ]]> 
  </industry>
  <employertype>合资</employertype> 
  <source>智联招聘</source> 
- <sourcelink>
- <![CDATA[ http://www.zhaopin.com/
  ]]> 
  </sourcelink>
  </display>
  </data>

我该怎么去把这些信息插入到data节点里呢?

#7


最简单的办法 直接把数据处理下  包裹下下呗,
string data="<![CDATA[ "+data+"]]> ";
OK

#8


引用 6 楼 pinhao89 的回复:
2楼的不错,用了linq
但是,我现在迷惑了C# code
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=pp;Integrated Security=True");
        string zhujiedian = "select loc,lastmod,changefreq,priorit……


01 string myXml =
02 @"<!--?xml version='1.0' encoding='utf-8'?-->
03 <workingset>
04  <data>
05  </data>
06 </workingset>";
07  
08 XmlDocument doc1 = new XmlDocument();
09  
10 doc1.LoadXml(myXml);
11  
12 XmlNode target = doc1.SelectSingleNode("WorkingSet/Data");
13  
14 if (target != null)
15 target.AppendChild(doc1.CreateCDataSection("
16 <customertag>Hello</customertag>
17 "));

使用 XDocument
view source
print?
1 XDocument doc = XDocument.Parse(myXml, LoadOptions.SetLineInfo);
2  
3 XElement dataNode = doc.Descendants("Data").First();
4  
5 dataNode.Add(new XCData("
6  
7 <customertag>Hello</customertag>
8  
9 Console.WriteLine(doc.ToString());

結果
view source
print?
1 <!--?xml version="1.0" encoding="utf-8"?-->
2 <workingset>
3  <data><!--[CDATA[<customertag-->Hello]]></data>
4 </workingset>

#9


你想把SQL Server数据库中的信息,查询出来,然后以XML文档保存?据我所知,直接用SQL Server数据库里面的函数转换,或者在.NET里面编程select数据后,构造xml文档。若你需要限制每个element的值类型和范围的话,应该需要*.xsd文件限制你生成的xml文档吧。

#10


引用 6 楼 pinhao89 的回复:
2楼的不错,用了linq
但是,我现在迷惑了

C# code
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=pp;Integrated Security=True");
        string zhujiedian = "select loc,lastmod,changefreq,pri……

一条url节点难点,难道会有两条data节点? 看你的数据表结构,不应该把,

你直接用title这些节点呗,把data节点去掉

#11


难点 去掉