2015-07-31 2 views
0

Я новичок в C#, и у меня есть два xml-файла, которые загружаются в мою программу как XDocument. Я хочу найти способ выполнить внутреннее соединение и сохранить результат в виде нового файла. Я не уверен, как я могу достичь этого, используя запросы XPath.Присоединяйтесь к двум файлам xml, используя запрос XPath в C#

Say здесь мой первый XML-файл:

<?xml version="1.0" encoding="utf-8"?> 

<People> 
    <Person> 
    <ID> 1 </ID> 
    <Gender> M </Gender> 
    </Person> 

    <Person> 
    <ID> 2 </ID> 
    <Gender> F </Gender> 
    </Person> 
</People> 

А вот мой второй XML-файл:

<?xml version="1.0" encoding="utf-8"?> 

<PeopleDetail> 
    <PersonDetail> 
    <ID> 1 </ID> 
    <Name> ABC </Name> 
    </PersonDetail> 

    <PersonDetail> 
    <ID> 2 </ID> 
    <Name> DEF </Name> 
    </PersonDetail> 
</PeopleDetail> 

И то, что я хочу получить это что-то вроде этого:

<Output> 
    <Join> 
    <Person> 
     <ID> 1 </ID> 
     <Gender> M </Gender> 
    </Person> 
    <PersonDetail> 
     <ID> 1 </ID> 
     <Name> ABC </Name> 
    </PersonDetail> 
    </Join> 

    <Join> 
    <Person> 
     <ID> 2 </ID> 
     <Gender> F </Gender> 
    </Person> 
    <PersonDetail> 
     <ID> 2 </ID> 
     <Name> DEF </Name> 
    </PersonDetail> 
    </Join> 
</Output> 

Оба файла загружаются в мою программу с помощью метода XDocument.Load():

var doc1 = XDocument.Load("first.xml"); 
var doc2 = XDocument.Load("second.xml"); 

Так может ли кто-нибудь сказать мне, как выполнить такое внутреннее соединение с помощью «ID»?

Благодаря

+0

Пожалуйста, измените свой вопрос, чтобы описать то, что вы пробовали. – Blackwood

ответ

1

Я не уверен, что XPath будет много пользы для вас, но вы можете сделать простое соединение с помощью LINQ и создать новый документ, содержащий эти элементы. Для ясности я переименовал doc1 и doc2 в people и details:

var joins = from person in people.Descendants("Person") 
      join detail in details.Descendants("PersonDetail") 
       on (int)person.Element("ID") equals (int)detail.Element("ID") 
      select new XElement("Join", person, detail); 

var output = new XDocument(
    new XElement("Output", 
     joins 
     ) 
    ); 

Вы можете увидеть рабочую демо здесь: https://dotnetfiddle.net/HP5VtD

+0

Спасибо, извините насчет путаницы, это не имеет ничего общего с XPath в приведенном выше примере. Но я использовал XPathSelectElements() в своей реальной программе, чтобы получить только нужные данные. Итак, что я наконец сделал, это что-то вроде этого, и он отлично работает: от человека в doc1.XPathSelectElements («запрос идет здесь») – Yoope

Смежные вопросы