我剛剛遇到了一個問題,我的代碼很好地解析了xml,但是一旦我在第二個節點中添加它就開始加載不正確的數據。真正的代碼跨越了一些類和項目,但對於我已經把導致問題的基本原理放在一起我的XML代碼或.NET中是否存在錯誤?
當代碼運行時,我期望輸出是第二個Task節點的內容,而是輸出第一個節點的內容。無論如何檢查設置對象的內部xml是第二個Task節點的時候,它始終從EmailAddresses節點的第一次出現拉動。致電SelectSingleNode("//EmailAddresses")
是問題發生的地方。
我解決此問題兩種方式
- 獲得任務或設置節點
方案一米的作品在這種情況下,後拆除爲EmailAddresses XPath表達式領先斜線
Clone()
但我相信這會導致我項目中的其他代碼停止工作。 解決方案2對我來說看起來更像是一種破解,而不是真正的解決方案。
我的問題是我是否正確地做到了這一點,並且.NET中存在一個錯誤(所有版本),還是我只是把XML拉錯了?
C#代碼
var doc = new XmlDocument();
doc.Load(@"D:\temp\Sample.xml");
var tasks = doc.SelectSingleNode("Server/Tasks");
foreach (XmlNode threadNode in tasks.ChildNodes)
{
if (threadNode.Name.ToLower() != "thread")
{
continue;
}
foreach (XmlNode taskNode in threadNode.ChildNodes)
{
if (taskNode.Name.ToLower() != "task" || taskNode.Attributes["name"].Value != "task 1")
{
continue;
}
var settings = taskNode.SelectSingleNode("Settings");
var emails = settings.SelectSingleNode("//EmailAddresses");
Console.WriteLine(emails.InnerText);
}
}
的XML
<?xml version="1.0"?>
<Server>
<Tasks>
<Thread>
<Task name="task 2">
<Settings>
<EmailAddresses>task 2 data</EmailAddresses>
</Settings>
</Task>
</Thread>
<Thread>
<Task name="task 1">
<Settings>
<EmailAddresses>task 1 data</EmailAddresses>
</Settings>
</Task>
</Thread>
</Tasks>
</Server>
,它在.NET中的錯誤是非常小的可能性。 – 2010-10-29 19:04:22
我認爲在XPath中,// EmailAddresses將返回一組XMLnodes。您是否嘗試過doc.SelectNodes(「// EmailAddresses」),然後獲取第二個? – dotariel 2010-10-29 19:05:16
首先,最後,永遠懷疑自己。 – duffymo 2010-10-29 19:11:01