簡體   English   中英

LINQ 到 XML - 無法從 XDocument 或 XElement 讀取元素或后代

[英]LINQ to XML - Unable to read Elements or Descendants from XDocument or XElement

下面給出的是我的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>

<Students>
  <Student>
    <Ordinal>1</Ordinal>
    <Name>Student1</Name>
    <BirthDate>Date1</BirthDate>
    <ID>ID1</ID>
  </Student>

  <Student>
    <Ordinal>2</Ordinal>
    <Name>Student2</Name>
    <BirthDate>Date2</BirthDate>
    <ID>ID2</ID>
  </Student>
</Students>

它存儲在本地並加載:

var path = @"C:\Users\Public\Desktop\LINQ - XML\Students.xml";
XDocument xDoc = XDocument.Load(path);
XElement xEl = XElement.Load(path);

當我將“XDoc”或“xEl”的內容打印到控制台時: Console.WriteLine(xDoc); 我得到了完整的 XML 文件。

但是,當我嘗試訪問(打印到控制台) xEl.Element("Student")xEl.Descendants("Student")xEl.Elements() (xDoc 也是)時,唯一打印到控制台的是 xContainer 信息行: System.Xml.Linq.XContainer+<GetElements>d__39

命名空間應該不是問題,但無論如何我都使用它們檢查了它們並得到了空白。

XNamespace ns = xEl.GetDefaultNamespace(); // For XElement
XNamespace df = xDoc.Root.Name.Namespace; // For XDocument

訪問這些元素的方法是什么?

Console.WriteLine 需要一個字符串。 如果您將 object 傳遞給此方法,則 object 應覆蓋 ToString 方法,否則它將打印完全限定的 object 名稱。

根據您的上述陳述,看起來 XDocument object 覆蓋了 ToString() 方法以允許控制台將 XML 內容打印為字符串。 If your return type is System.Xml.Linq.XContainer+<GetElements> try using LINQ to convert the object and print to the console.

您無法打印作為 XContainer object 的 XElements 集合。 您需要遍歷每個 XElement 並打印它。

下面的 LINQ 查詢應該可以工作:

xEl.Elements().ToList().ForEach(Console.WriteLine);

您已經可以訪問這些元素。 Console.WriteLine的作用只是一個誤解。

Console.WriteLine只需調用ToString即可。
對於XNodeToString被覆蓋以返回 Xml 字符串。 資源

它適用於xEl.Element因為它返回一個XElement XElement是一個XContainer ,即一個XNode 因此將調用 XNode 覆蓋方法。

但不適用於 Descendants,因為它返回一個等待枚舉的集合。 懶人linQ。

為了顯示您的結果,您可以枚舉后代並在它們上調用ToString

foreach(var el in xEl.Descendants("Student")){
    Console.WriteLine(el);
}

這是一個示例:現場演示

var input = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Students>
<Student>
<Ordinal>1</Ordinal>
<Name>Student1</Name>
<BirthDate>Date1</BirthDate>
<ID>ID1</ID>
</Student>


<Student>
<Ordinal>2</Ordinal>
<Name>Student2</Name>
<BirthDate>Date2</BirthDate>
<ID>ID2</ID>
</Student>
</Students>";

// Parse string is equivalent to load path. 
XDocument xDoc = XDocument.Parse(input);
XElement xEl = XElement.Parse(input);

var xDocString = xDoc.ToString();

var XElElement = xEl.Element("Student").ToString();
// => <Student>  <Ordinal>1</Ordinal> ...

var XElDecendant = xEl.Descendants("Student").ToString();
// => System.Xml.Linq.XContainer+<GetDescendants>d__39
// I'm a linQ container containing XNode, please enumerate me. 


var xDocElement = xDoc.Element("Student").ToString();
//=> null

var xDocDecendant = xDoc.Descendants("Student").ToString();            
// => System.Xml.Linq.XContainer+<GetDescendants>d__39
// I'm a linQ container containing XNode, please enumerate me. 

foreach(var el in xEl.Descendants("Student")){
    Console.WriteLine(el);
}       

得到第一個學生

XDocument data = XDocument.Load("students.xml");
Console.WriteLine(data.Root.Elements().ElementAt(0));

獲取節點 i

Console.WriteLine(data.Root.Elements().ElementAt(0).Nodes().ElementAt(i));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM