【问题标题】:What's the easiest way to Parse an XML file with many different levels?解析具有许多不同级别的 XML 文件的最简单方法是什么?
【发布时间】:2014-03-08 00:28:24
【问题描述】:

我知道这是一个很长的问题.. 但是我在这里发疯了,试图学习解析 XML 文档的众多方法中的一种... 我在网上的很多示例都是非常简单的 XML 文档.. 但是我有一些多层次的东西,我想解析它..

我的班级代码在这里:http://pastebin.com/VKbWzKHG

<?xml version="1.0" encoding="utf-8"?>
<PageList>
    <Page>
        <UpperLeft>
            <Parameters>
                <League>AL</League>
                <Season>R</Season>
                <Category>Runs</Category>
                <RankOrder>n/a</RankOrder>
            </Parameters>
            <Info>
                <Row1>
                    <TeamLogo>LAA.tif</TeamLogo>
                    <Rank>1.</Rank>
                    <Name>Trout</Name>
                    <Stat>109</Stat>
                </Row1>
                <Row2>
                  .
                  .
                  .
                </Row5>
            </Info>
        </UpperLeft>
        <UpperRight>
            .
            .
            .
        </UpperRight>
        <LowerLeft>
            .
            .
        </LowerLeft>
        <LowerRight>
            .
            .
        </LowerRight>
    </Page>
</PageList>

几乎会有很多页面..我不想粘贴完整的东西所以我试着把它剪掉..但这是结构:

page
  --> upper left
      --> parameters
          --> league
          --> season
          --> category
          --> rankorder
      --> info
          --> row 1
              --> team logo
              --> rank
              --> name
              --> stat
          --> row 2 to row 5
  --> upper right, lower left, lower right
end page

我怎样才能成功解析这个噩梦?一切都是我创建的一个漂亮而整洁的类..但是试图把所有东西都放回一个类我只是遇到了很多麻烦..

XDocument xdoc;
        try
        {
            List<MLBPage> collection =
            {
                from e in XDocument.Load("PageList.xml").Root.Elements("PageList")

                select new MLBPage
                {
                    ul = new Quadrant  //upper left
                    {
                        qp = new QuadrantParameters
                        {
                            //league, season, category, rank order here
                        },
                        qi = new QuadrantInfo
                        {
                            //team logo, rank, name, stat here
                        }
                    }
                }
            }
        }
        catch (Exception)
        {
            /

【问题讨论】:

  • 你为什么不创建一个与 xml 完全一样的类结构并反序列化它?
  • 我确实有一个类似于 xml 的类...我将编辑 OP 并粘贴这些类。因为我不确定如何反序列化?
  • 好的,我粘贴了我的课程..你们能给我一个你正在谈论的反序列化的例子吗?只是想找到解决办法

标签: c# xml linq linq-to-xml xmlreader


【解决方案1】:

您可以开始映射类/属性/元素:

[Serializable] //Root
[XmlRoot(ElementName = "InfXml", Namespace="the namespace URI")]
public class InfXml
{
    [XmlAttribute(AttributeName = "id")] //attribute
    public string Id { get; set; }
    public bool ShouldSerializeId() //Should serialize, only serializes if not null.
    {
        return !string.IsNullOrEmpty(Id); //This is only for optional fields.
    }

    [XmlElement(ElementName = "Identification")] //Non optional group.
    public Identification Identification{ get; set; }

    [XmlElement(ElementName = "Adress")] //Optional group.
    public Adress Adress{ get; set; }
    public bool ShouldSerializeAdress()
    {
        return Adress!= null;
    }
}

如果你有一个类到 XML 的映射,你可以使用这 2 种方法:

const string PrefixXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";

public static object Deserialize<T>(T obj, string xmlText)
{
    try
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(T));
        TextReader textReader = new StringReader(xmlText);
        return (T)deserializer.Deserialize(textReader);
    }
    catch (Exception ex)
    {
        //Catch here.
        return null;
    }

}

public static XmlDocument Serialize<T>(T obj)
{
    string xmlString = GerarXml.Gerar<T>(obj);
    if (!xmlString.Contains("xml version="))
    {
        xmlString = PrefixXml + xmlString;
    }
    xmlString = xmlString.Replace(Environment.NewLine, string.Empty);
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xmlString);
    return doc;
}

如果您想将 XML 作为字符串获取:

public static string GetXmlText(XmlDocument doc)
{
    StringWriter stringWriter = new StringWriter();
    XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

    doc.WriteTo(xmlTextWriter);

    string ret = stringWriter.ToString();

    ret = ret.Replace(Environment.NewLine, string.Empty);
    if (!ret.Contains("xml version="))
    {
        return PrefixXml + ret;
    }
    return ret;

}

【讨论】:

  • 哇,我希望它就这么简单...好吧,我将重命名 XML 字段,以便它们与我的类完全匹配并试一试。 tyvm
  • 好的。给我反馈,我有更多代码要分享。
  • 好吧,我会花一点时间,我会在一个小时后下班,可能要到明天或星期一才能回到这个问题。但我希望你能回来看看。再次tyvm
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 2013-07-06
  • 2023-03-17
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2010-09-05
  • 2014-05-17
相关资源
最近更新 更多