LINQ to XML:解析XML文件,其中一个节点呈现另一个节点的类型

时间:2008-11-16 12:10:58

标签: xml linq parsing

西洛!

是否可以使用一个节点的字符串值来告诉使用LINQ to XML在另一个节点中显示哪种类型的字段?

例如:

<node>
  <name>nodeName</name>
  <type>string</type>
</node>
<node>
  <name>0</name>
  <type>bool</type>
</node>
<node>
  <name>42</name>
  <type>int</type>
</node>

提前致谢

2 个答案:

答案 0 :(得分:3)

好吧,鉴于类型信息仅在执行时已知,您将无法获得一个好的静态类型API - 但您可以轻松地在XElement上编写一个扩展方法,该方法查找相应的子元素并返回System.Object 。例如(未经测试):

public static object ParseValue(this XElement element)
{
    XElement name = element.Element("name");
    XElement type = element.Element("type");
    // Insert error handling here :)

    switch (type.Value)
    {
        case "int":
            return int.Parse(name.Value);
        case "string":
            return name.Value;
        case "bool":
            return name.Value == "1"; // Or whatever
        default:
            throw new ArgumentException("Unknown element type " + type.Value);
    }
}

这不是我设计数据格式的方式,而是如果它被推到你身上......

答案 1 :(得分:2)

public static void Main() {
    var xmlNodes = new XElement( "Nodes",
        new XElement( "Node",
            new XElement( "Name", "nodeName" ),
            new XElement( "Type", "string" )
        ),
        new XElement( "Node",
            new XElement( "Name", "True" ),
            new XElement( "Type", "bool" )
        ),
        new XElement( "Node",
            new XElement( "Name", "42" ),
            new XElement( "Type", "int" )
        )
    );

    var converters = new Dictionary<string,Func<string,object> >  {
        { "string", val => val },
        { "bool", val => Boolean.Parse( val ) },
        { "int", val => Int32.Parse( val ) }
    };

    var values = 
        from node in xmlNodes.Elements( "Node" )
        select converters[ node.Element( "Type" ).Value ]( node.Element( "Name" ).Value );

    foreach( var value in values )
        Console.WriteLine( value.GetType().ToString() + ": " + value );
}