xml.linq如何解析如下xml文件

joyhen 2014-03-14 11:04:57
xml文件结构

<?xml version="1.0" encoding="UTF-8" ?>
<teacher LessonTitle="测试">
<general title="你懂的" msg="不懂"/>
<descrption document="jjkk" />
<part PartTitle="测试" PartNum="5" PartOver="1">
<sco ScoTitle="S001" isok="测试" />
<quest Title="测试" />
</part>
<part PartTitle="测试" PartNum="5" PartOver="1">
<sco ScoTitle="S001" isok="测试" />
<quest Title="测试" />
<!--间隔线-->
<sco ScoTitle="S001" isok="测试" />
<quest Title="测试" />
</part>
<part PartTitle="测试" PartNum="5" PartOver="1">
<sco ScoTitle="S001" isok="测试" />
<quest Title="测试" />
<!--间隔线-->
<sco ScoTitle="S001" isok="测试" />
<quest Title="测试" />
<!--间隔线-->
<sco ScoTitle="S001" isok="测试" />
<quest Title="测试" />
</part>
....part节点
</teacher>

想得到teacher对象,大致类结构(设计的可能不合理)如下:
public class teacher
{
public string LessonTitle { get; set; }
public general general{ get; set;}
public descrption descrption{ get; set;}
public List<part> partlist{ get; set; }
}

public class general
{
public string title { get; set; }
public string msg { get; set; }
}
public class descrption
{
public string document { get; set; }
}

//================>part
public class part
{
public string PartTitle { get; set; }
public string PartNum { get; set; }
public string PartOver { get; set; }
List<kk> sco_quest{ get; set; }
}
public class kk
{
public sco sco{ get; set; }
public quest quest{ get; set; }
}
public class sco
{
public string ScoTitle { get; set; }
public string isok { get; set; }
}
public class quest
{
public string Title { get; set; }
}

如果是用XmlDocument来做可以做到,但是代码量有点多,如何快速用linq处理得到teacher对象呢。求支招
...全文
179 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝_爸 2014-03-14
  • 打赏
  • 举报
回复
<sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> 这种好像还是不行啊
宝_爸 2014-03-14
  • 打赏
  • 举报
回复
好像可以,等我试一下。
宝_爸 2014-03-14
  • 打赏
  • 举报
回复
那就只能用XDocument 或者XmlDocument自己一个一个element, attribute解析了。
joyhen 2014-03-14
  • 打赏
  • 举报
回复
引用 1 楼 findcaiyzh 的回复:
这种mapping用XmlSerialzer 比较好。 不过你这个xml 有点问题,一般数组会有一个根 <?xml version="1.0" encoding="UTF-8" ?> <teacher LessonTitle="测试"> <general title="你懂的" msg="不懂"/> <descrption document="jjkk" /> <parts> <part PartTitle="测试" PartNum="5" PartOver="1"> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> </part> <part PartTitle="测试" PartNum="5" PartOver="1"> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> </part> <part PartTitle="测试" PartNum="5" PartOver="1"> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> </part> ....part节点 </parts> </teacher>
您说的很对,关键是请求过来的xml就是这样,可以通过代码,插入跟节点。问题还是如上
宝_爸 2014-03-14
  • 打赏
  • 举报
回复
这种mapping用XmlSerialzer 比较好。 不过你这个xml 有点问题,一般数组会有一个根 <?xml version="1.0" encoding="UTF-8" ?> <teacher LessonTitle="测试"> <general title="你懂的" msg="不懂"/> <descrption document="jjkk" /> <parts> <part PartTitle="测试" PartNum="5" PartOver="1"> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> </part> <part PartTitle="测试" PartNum="5" PartOver="1"> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> </part> <part PartTitle="测试" PartNum="5" PartOver="1"> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> <!--间隔线--> <sco ScoTitle="S001" isok="测试" /> <quest Title="测试" /> </part> ....part节点 </parts> </teacher>
joyhen 2014-03-14
  • 打赏
  • 举报
回复
引用 10 楼 findcaiyzh 的回复:
Object-xml 映射还是XmlSerializer简单点。Linq to xml,如果结果一遍,还要写代码。 XmlSerializer只要定义个新的成员就可以了 。
我想问一下,如果某个节点的某个属性(XmlAttribute标记对象)可能不存在(它是不确定的),在其它的相同节点中会出现,这个时候,XmlAttribute标记改怎么处理
宝_爸 2014-03-14
  • 打赏
  • 举报
回复
Object-xml 映射还是XmlSerializer简单点。Linq to xml,如果结果一遍,还要写代码。 XmlSerializer只要定义个新的成员就可以了 。
joyhen 2014-03-14
  • 打赏
  • 举报
回复
引用 8 楼 findcaiyzh 的回复:
IsNullable = true 可以去掉,不影响
引用 6 楼 Joyhen 的回复:
引用 4 楼 findcaiyzh 的回复:
好像可以,等我试一下。
非常感谢,鉴于part部分的子节点,是成对出现的,且一样没有根对象,弄起来很麻烦,暂时用原来的方式处理。
犀利,。回头研究下linq的嵌套,再次感谢阁下帮忙
宝_爸 2014-03-14
  • 打赏
  • 举报
回复
IsNullable = true 可以去掉,不影响
宝_爸 2014-03-14
  • 打赏
  • 举报
回复
都解决了,完整解决方案:

            XmlSerializer serializer = new XmlSerializer(typeof(teacher));


            using (TextReader reader = new StreamReader("XmlFile1.xml"))
            {
                teacher result = serializer.Deserialize(reader) as teacher;
            }

    [XmlRoot]
    public class teacher
    {
        [XmlAttribute]
        public string LessonTitle { get; set; }

        [XmlElement]
        public general general { get; set; }

        [XmlElement]
        public descrption descrption { get; set; }

        [XmlElement("part")]
        public List<part> partlist { get; set; }
    }

    public class general
    {
        [XmlAttribute]
        public string title { get; set; }

        [XmlAttribute]
        public string msg { get; set; }
    }
    public class descrption
    {
        [XmlAttribute]
        public string document { get; set; }
    }

    //================>part
    public class part
    {
        [XmlAttribute]
        public string PartTitle { get; set; }

        [XmlAttribute]
        public string PartNum { get; set; }

        [XmlAttribute]
        public string PartOver { get; set; }

        [XmlElement(ElementName = "sco", Type = typeof(sco), IsNullable = true)]
        [XmlElement(ElementName = "quest", Type = typeof(quest), IsNullable = true)]
        public List<kk> kks { get; set; } 
        
    }

    public class kk
    {
    }
    public class sco : kk
    {
        [XmlAttribute]
        public string ScoTitle { get; set; }

        [XmlAttribute]
        public string isok { get; set; }
    }
    public class quest :kk
    {
        [XmlAttribute]
        public string Title { get; set; }
    }
测试xml:

<?xml version="1.0" encoding="UTF-8" ?>
<teacher LessonTitle="测试">
  <general title="你懂的" msg="不懂"/>
  <descrption document="jjkk" />
  <part PartTitle="测试" PartNum="5" PartOver="1">
    <sco ScoTitle="S001" isok="测试1"  />
    <quest Title="quest1" />
  </part>
  <part PartTitle="测试" PartNum="5" PartOver="1">
    <sco ScoTitle="S002" isok="测试2"  />
    <quest Title="quest2" />
    <!--间隔线-->
    <sco ScoTitle="S003" isok="测试3"  />
    <quest Title="quest3" />
  </part>
  <part PartTitle="测试"  PartNum="5" PartOver="1">
    <sco ScoTitle="S004" isok="测试4"  />
    <quest Title="测试4" />
    <!--间隔线-->
    <sco ScoTitle="S005" isok="测试5"  />
    <quest Title="测试5" />
    <!--间隔线-->
    <sco ScoTitle="S006" isok="测试6"  />
    <quest Title="测试6" />
  </part>
</teacher>
joyhen 2014-03-14
  • 打赏
  • 举报
回复
引用 4 楼 findcaiyzh 的回复:
好像可以,等我试一下。
非常感谢,鉴于part部分的子节点,是成对出现的,且一样没有根对象,弄起来很麻烦,暂时用原来的方式处理。

62,025

社区成员

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

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

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

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