2015-03-12 6 views
0

Я работаю с конкретной программой FundsXML-Schema, пытаясь получить все необходимые файлы XML-файла для прохождения итерации.Cant go глубже, чем root, LINQ to (Funds) XML, C#

Краткий пример XML-файла:

<?xml version="1.0" encoding="utf-8"?> 
<FundsXML xmlns="http://www.fundsxml.org/XMLSchema/3.0.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="3.0.5" xsi:schemaLocation="http://www.fundsxml.org/XMLSchema/3.0.5 FundsXML3.0.5.xsd"> 
<Date>2015-02-27</Date> 
... 
<AssetMasterData> 
    <Asset> 
     <SecurityCodes> 
     <ISIN>XXXXXXXXXXXX</ISIN> 
     </SecurityCodes> 
    </Asset> 
    ... 
    <Asset> 
</AssetMasterData> 
</FundsXML> 

Я хочу перебирать Asset с там. Я пробовал:

XDocument xmlTree = XDocument.Load(xmlPath); 
XElement root = xmlTree.Root; 
foreach (XElement f in root.Descendants()) 
     { 
      System.Windows.MessageBox.Show(f.Name.ToString() +" ; "+f.Value.ToString()); 
     } 

Выход: {http://www.fundsxml.org/XMLSchema/3.0.5} Дата; 2015-02-27

Вторая часть должна состоять в том, чтобы прочитать ISIN каждого узла Asset. Но у меня не было времени на это, потому что я потерпел неудачу в первой части.

EDIT:

Решение было искать имен + имя:

foreach (XElement f in root.Descendants("{http://www.fundsxml.org/XMLSchema/3.0.5}Asset")) 

Лучшее решение, на мой взгляд:

foreach (XElement f in root.Descendants(xmlTree.Root.GetDefaultNamespace()+"Asset")) 

ответ

0

Поскольку ваш XML находится в пространстве имен, вам необходимо добавить информацию о пространстве имен в запрос потомков.

Вы можете увидеть пример here

Вы можете попытаться получить

roots.Descendants() 

Без фильтрации и проверки узлов, которые он возвращает, чтобы подтвердить это.

+0

Но разве пользователь не ищет значение элемента, а не имя элемента? EDIT: так что если вы ищете потомков(), не указав имя элемента, он будет копаться до первого элемента, который имеет значение? –

+1

Да, но чтобы получить значение, он должен сначала обратиться к элементам по их правому названию. Он не находит «Asset» для повторения, потому что, я думаю, он не смотрит их по их полному имени пространства имен +. EDIT: Descendants() вернет ВСЕ элементы под root. – Juan

+0

Пространство имен решало проблему, спасибо большое! – ZonRian

0

На основе данных выборки вы при условии

<Asset></Asset> 

, похоже, не содержит никаких данных. Вам нужно будет получить

foreach (XElement f in root.Descendants("ISIN")) 

Я думаю, в любом случае. Если нет фактического текста, тогда вы получите пустое или пустое значение? Значит, похоже, что он возвращает то, о чем вы просите?

+0

Да, образец очень короткий, потому что исходный файл имеет более 2000 строк. Я просто хотел показать структуру XML. root.Descendants ("ISIN") - это нуль (как и все другие мои попытки), а не пустая строка или что-то в этом роде – ZonRian

+0

. Вы сказали, что он возвращается пустым, а не нулевым. Вы пробовали пойти в ISIN? –