【问题标题】:Converting this xml file to my object将此 xml 文件转换为我的对象
【发布时间】:2014-04-09 09:37:26
【问题描述】:

这类似于What is the easiest way to convert this XML document to my object? 之类的问题,但我认为有一些额外的复杂性。

我想从这个 xml 中获取以下对象。但是,因为我的 Bean 类需要的东西是类似命名的子元素而不是属性,而且部件和集合有点乱。我不完全确定如何处理。

XML,我在一个 XDocument 中

<bean class="com.nathan.etc.etc">
  <property name="documentName" value="\\myfilepath" />
  <property name="containerNames">
    <list>
      <value>One</value>
      <value>Two</value>
    </list>
  </property>
  <property name="partNames">
    <list>
        <list>
            <value>First Part of One</value>
            <value>Second Part of One</value>
        </list>
        <list>
            <value>First Part of Two</value>
            <value>Second Part of Two</value>
        </list>
    </list>
  </property>   
</bean>

C#代码

class Bean {

    public string FilePath {get; set;}   //eg "\\myfilepath"

    public List<Container> Containers {get; set;}

}

class Container {

    public string Name {get; set;}  //eg "One"

    public List<Part > Parts {get; set;}

}

class Part {

    public string Name {get; set;}   //eg "First Part of One"

}

【问题讨论】:

  • 我假设在链接的问题中有花哨的序列化技巧。我最初的计划是使用 XDocument 来挖掘我需要的东西,但这很棘手并且会产生易碎的混乱代码。
  • 可能会更容易阅读您的 XML 并手动构建您的对象结构
  • 你的意思是使用像 xml.linq 这样的东西: ... var properties = beanObject.Elements("property").ToList(); DocumentPath = properties.Where(item => item.Attribute("name").Value == "documentName").First().Attribute("value").Value; ...然后手动挖出来?

标签: c# xml deserialization


【解决方案1】:

我正在为XmlDocument 写作,但您可以轻松适应XDocument

var xmlDoc = new XmlDocument();
// ... load it

var bean = new Bean{ Containers = new List<Container>() };
bean.FilePath = xmlDoc.SelectSingleNode("/bean/property[@name='documentName']")
                      .GetAttribute("value");
int index = 1;
foreach(XmlElement xmlContainer in xmlDoc.SelectNodes(
           "/bean/property[@name='containerNames']/list/value"))
{
    var container = new Container
    { 
        Name  = xmlContainer.InnerText,
        Parts = new List<Part>()
    };

    foreach(XmlElement xmlPart in xmlDoc.SelectNodes(String.Format(
           "/bean/property[@name='partNames']/list/list[{0}]/value", index)))
    {
        var part = new Part{ Name = xmlPart.InnerText };
        container.Parts.Add(part);
    }

    bean.Containers.Add(container);
    index++;
}

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2013-02-01
    • 2013-07-13
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多