LINQ to XML: анализ XML-файла, один из узлов которого представляет тип другого узла. - PullRequest
3 голосов
/ 16 ноября 2008

Helo!

Можно ли использовать строковое значение одного узла, которое сообщает, какой тип поля представлен в другом узле с использованием 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 ]

3 голосов
/ 16 ноября 2008

Ну, вы не получите хороший статически типизированный 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);
    }
}

Это не то, как я разработал формат данных, но если вам навязывают ...

2 голосов
/ 16 ноября 2008
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 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...