XElement类的一些属性和方法

测试一下XElement类和XDocument的一些属性和方法。自己多注意看下重载。

▲ 查询 Xml 的方法

▲ 查询 Xml 的方法

一个Test.xml文档如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<Person>
<Name>孙悟空</Name>
<Age>500</Age>
<Sex>男</Sex>
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>
<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>
<Good>100</Good>
<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>
</Person>

Root 属性

1
2
3
4
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

Console.WriteLine(rootElem.ToString());

直接转字符串,是按原样输出。当然,没有前面那个属性了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Person>
<Name>孙悟空</Name>
<Age>500</Age>
<Sex></Sex>
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>
<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>
<Good>100</Good>
<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>
</Person>

也可以直接按下面加载Root属性:

1
XElement rootElem = XElement.Load("Test.xml");

Nodes 方法

1
2
3
4
5
6
7
8
9
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

IEnumerable<object> allNodes = rootElem.Nodes();
foreach (var item in allNodes)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<Name>孙悟空</Name>

<Age>500</Age>

<Sex></Sex>

<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>

<Good>100</Good>

<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>

返回的是object类型的集合,都是下一级的子节点。

Elements 方法

还要重载:

1
public IEnumerable<XElement> Elements(XName name);

因为和上面是继承关系,所以差不多。

1
2
3
4
5
6
7
8
9
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

IEnumerable<XElement> allNodes = rootElem.Elements();
foreach (var item in allNodes)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<Name>孙悟空</Name>

<Age>500</Age>

<Sex></Sex>

<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>

<Good>100</Good>

<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>

返回的是XElement类型的集合,都是下一级的子节点。

看看重载,加一个XNameDog

1
2
3
4
5
6
7
8
9
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

IEnumerable<XElement> allNodes = rootElem.Elements("Dog");
foreach (XElement item in allNodes)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>

<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>

可见,能查询到所有的Dog节点。

XElement 方法

这个是返回第一个符号的节点。

1
2
3
4
5
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

XElement xElement = rootElem.Element("Dog");
Console.WriteLine(xElement.ToString());

输出:

1
2
3
4
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

Descendsants 方法

1
2
3
4
5
6
7
8
9
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

IEnumerable<XElement> xElements = rootElem.Descendants();
foreach(var item in xElements)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

看下效果,全部输出来了。节点,子节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<Name>孙悟空</Name>

<Age>500</Age>

<Sex></Sex>

<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Name>小黑</Name>

<Age>9</Age>

<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>

<Name>小黄</Name>

<Age>10</Age>

<Good>100</Good>

<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>

<Name>小辉</Name>

<Age>15</Age>

DescendantNodes 方法

1
2
3
4
5
6
7
8
9
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

IEnumerable<object> xElements = rootElem.DescendantNodes();
foreach(var item in xElements)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

效果是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<Name>孙悟空</Name>

孙悟空

<Age>500</Age>

500

<Sex></Sex>



<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Name>小黑</Name>

小黑

<Age>9</Age>

9

<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>

<Name>小黄</Name>

小黄

<Age>10</Age>

10

<Good>100</Good>

100

<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>

<Name>小辉</Name>

小辉

<Age>15</Age>

15

DescendantsAndSelf 方法

注意看重载,还可以指定节点XName名称。

1
2
3
4
5
6
7
8
9
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

IEnumerable<XElement> xElements = rootElem.DescendantsAndSelf();
foreach(var item in xElements)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<Person>
<Name>孙悟空</Name>
<Age>500</Age>
<Sex></Sex>
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>
<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>
<Good>100</Good>
<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>
</Person>

<Name>孙悟空</Name>

<Age>500</Age>

<Sex></Sex>

<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Name>小黑</Name>

<Age>9</Age>

<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>

<Name>小黄</Name>

<Age>10</Age>

<Good>100</Good>

<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>

<Name>小辉</Name>

<Age>15</Age>

Ancestors 方法

1
2
3
4
5
6
7
8
9
10
11
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

XElement xElem = rootElem.Element("Dog").Element("Name");

IEnumerable<XElement> xElements = xElem.Ancestors();
foreach(var item in xElements)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Person>
<Name>孙悟空</Name>
<Age>500</Age>
<Sex></Sex>
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>
<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>
<Good>100</Good>
<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>
</Person>

AncestorsAndSelf 方法

1
2
3
4
5
6
7
8
9
10
11
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

XElement xElem = rootElem.Element("Dog").Element("Name");

IEnumerable<XElement> xElements = xElem.AncestorsAndSelf();
foreach(var item in xElements)
{
Console.WriteLine(item.ToString());
Console.WriteLine();
}

效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<Name>小黑</Name>

<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>

<Person>
<Name>孙悟空</Name>
<Age>500</Age>
<Sex></Sex>
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>
<Dog>
<Name>小黄</Name>
<Age>10</Age>
</Dog>
<Good>100</Good>
<Dog>
<Name>小辉</Name>
<Age>15</Age>
</Dog>
</Person>

它包含了自己。

Parent 属性

1
2
3
4
5
6
7
8
XDocument xDocTest = XDocument.Load("Test.xml");
XElement rootElem = xDocTest.Root;

XElement xElem = rootElem.Element("Dog").Element("Name");

XElement xElemParent = xElem.Parent;

Console.WriteLine(xElemParent.ToString());

效果:

1
2
3
4
<Dog>
<Name>小黑</Name>
<Age>9</Age>
</Dog>




参考:《C#图解教程》P383

感谢支持!