[英]How to load XML Elements using LINQ from XDocument into a class (not using Descendants)
[英]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
即可。
對於XNode
, ToString
被覆蓋以返回 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.