不能超越root,LINQ to(Funds)XML,C#

时间:2015-03-12 11:03:23

标签: c# linq-to-xml xelement

我正在使用特定的FundsXML-Schema尝试获取特定XML文件的所有Assets以进行迭代。

xml-file的简短示例:

<?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年2月27日

第二部分是读取每个Asset节点的ISIN。 但我没有时间这样做,因为我在第一部分失败了。

编辑:

解决方案是搜索命名空间+名称:

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"))

2 个答案:

答案 0 :(得分:0)

根据您提供的示例数据

<Asset></Asset>

似乎没有任何数据。你需要得到

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

无论如何我想。如果没有实际文本,那么你会得到一个空白或空值?所以听起来它回归了你要求的东西?

答案 1 :(得分:0)

由于您的XML位于命名空间中,您需要将命名空间信息添加到Descendants查询中。

您可以看到示例here

您可以尝试获取

roots.Descendants()

不过滤并检查它返回的节点以确认这一点。