【发布时间】:2014-01-29 18:44:01
【问题描述】:
我正在处理一个具有非常嵌套结构的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Stuff>
<Item Class="Consumable">
<CalledAs>ResourceAlpha</CalledAs>
<ID>ResourceAlpha25367</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceAlpha</CalledAs>
<ID>ResourceAlpha25368</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceAlpha</CalledAs>
<ID>ResourceAlpha25371</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceAlpha</CalledAs>
<ID>ResourceAlpha25372</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceBeta</CalledAs>
<ID>ResourceBeta25376</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceBeta</CalledAs>
<ID>ResourceBeta25377</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceBeta</CalledAs>
<ID>ResourceBeta25381</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceBeta</CalledAs>
<ID>ResourceBeta25384</ID>
</Item>
<Item Class="Consumable">
<CalledAs>ResourceBeta</CalledAs>
<ID>ResourceBeta25388</ID>
</Item>
<Item Class="Construct">
<Named>ClosedFolders</Named>
<ID>ClosedFolders25393</ID>
<StorageCabinet>(102, 0, 94)</StorageCabinet>
<AssignedTo>Colonist</AssignedTo>
<Assigned Class="Consumable">
<CalledAs>ResourceBeta</CalledAs>
<ID>ResourceBeta25238</ID>
</Assigned>
</Item>
<Item Class="Construct">
<Named>ClosedFolders</Named>
<ID>ClosedFolders25394</ID>
<StorageCabinet>(105, 0, 95)</StorageCabinet>
<AssignedTo>Colonist</AssignedTo>
</Item>
<Item Class="Construct">
<Named>ClosedFolders</Named>
<ID>ClosedFolders25395</ID>
<StorageCabinet>(103, 0, 92)</StorageCabinet>
<AssignedTo>Colonist</AssignedTo>
<Assigned Class="Consumable">
<CalledAs>ResourceAlpha</CalledAs>
<ID>ResourceBeta45232</ID>
</Assigned>
</Item>
</Stuff>
</Root>
现在,我需要获取所有 ID 的列表,这样当我添加新的 Consumable 或 Assigned 时,我可以生成(并确保它是唯一的)新 ID。
这是我加载文件的方式:
String savefile = Settings.Default.SelectedSaveFilePath;
var xmlDocument = new XmlDocument();
xmlDocument.Load(savefile);
var selectSingleNode = xmlDocument.SelectSingleNode("/Root/Stuff/Item[@Class='Consumable']");
if (selectSingleNode != null)
{
// Attempt to loop
}
现在,在/Root/Stuff/Item[@Class='Consumable'] 级别,我很适合获得<ID>,但在/Root/Stuff/Item[@Class='Construct'] 有一个嵌套,需要对每个子进行排序才能获得@ 的<ID> 987654330@
我正在尝试生成整个文档中所有 <ID> 节点的列表,如果可能,键值集合 其中<ID> 是值和元素(其中<ID> 属于) 作为 Key。
我也知道<ID> 在文档中是唯一的,无论其父级如何。所以我可以通过搜索 ID 直接找到任何元素。
我希望这更有意义。
谢谢。
【问题讨论】:
-
所有 ID 元素值的列表?好的,这听起来相当简单 - 但如果您尝试自己找到答案,您会学到更多。您已经尝试过什么,出了什么问题?
-
无法创建路径。给定的示例非常简单。实际数据超过 25 MB 的 XML 和敏感数据,所以我不粘贴。
-
“制作路径”是什么意思?您至少能够在 LINQ to XML 中加载文档吗?我没有要求实际数据...
-
更新了问题。现在是凌晨 2 点 36 分。我有点儿慢。对不起。
-
目前还不清楚您为什么要使用 XPath,老实说 - 我只是使用元素、后代等。也不清楚您在代码中给出的 XPath 表达式必须是什么使用您提供的 XML。