Я работаю с конкретной программой 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"))
Но разве пользователь не ищет значение элемента, а не имя элемента? EDIT: так что если вы ищете потомков(), не указав имя элемента, он будет копаться до первого элемента, который имеет значение? –
Да, но чтобы получить значение, он должен сначала обратиться к элементам по их правому названию. Он не находит «Asset» для повторения, потому что, я думаю, он не смотрит их по их полному имени пространства имен +. EDIT: Descendants() вернет ВСЕ элементы под root. – Juan
Пространство имен решало проблему, спасибо большое! – ZonRian