2012-06-04 3 views
1

У меня есть XML-узел со следующим форматом. Этот узел должен быть преобразован в типе определяемого пользователя, который каждый узел должен преобразовать объект сказать MyClassОбработка Xnode с Linq эффективно

class MyClass 
{ 
    public string tag1Id {get;set;} 
    public int tag3Val {get;set;} 
    public string tag3Id {get;set;} 
    public int tag5Val {get;set;} 
    public string tag5Id {get;set;} 
    public DataTime tag7Val {get;set;} 

} 

    <tag1 id="id1"> 
    <tag2> 
     <tag3 id="id3">10</tag3> 
     <tag4> 
     <tag5 id="id5">20</tag5> 
     </tag4> 
    </tag2> 
    <tag6> 
     <tag7>2010-12-31</tag7> 
    </tag6> 
    </tag1> 

Я новичок в LINQ, Это может быть сделано с помощью LINQ. Требование это xmlseralization не следует использовать :( Есть ли другой подход, с помощью которого этот сценарий может быть обработан легко?

+0

В чем смысл этого xml? Имена ужасны. Если используемый xml не принадлежит устаревшему коду, измените его так, чтобы он имел значение, или будет невозможно отлаживать/поддерживать/понимать годы с этого момента, если это необходимо. –

ответ

0

Нет это не может быть сделано.

Там должно быть преобразование сделано где-то из-за бизнес-логики сантехнику, чтобы перейти к конкретным свойствам от требуемых идентификаторов/местоположений узлов.

Что можно сделать, это закодировать конструктор, который берет в узел и соответствующим образом заполняет свойства. Linq затем может использоваться для перечисления по узлам и создать новую проекцию элементов класса с помощью выбора, например:

 string data = @" 
<tags> 
    <tag id=""id1""> 
    <tag2> 
     <tag3 id=""id3"">10</tag3> 
     <tag4> 
     <tag5 id=""id5"">20</tag5> 
     </tag4> 
    </tag2> 
    <tag6> 
     <tag7>2010-12-31</tag7> 
    </tag6> 
    </tag> 
</tags> 
    "; 
var xml = XDocument.Parse(data); 

    var classes = xml.Descendants("tag1") 
        .Select(nd => new MyClass(nd)); 
Смежные вопросы