LINQ to XML 可以看作是一个 “better DOM” 编程模型,可以和 System.Xml.dll 程序集中的很多成员交互。
一、命名空间
System.Xml.Linq.dll 程序集定义了三个命名空间:System.Xml.Linq, System.Xml.Schema 和 System.Xml.XPath
最核心的是 System.Xml.Linq, 定义了对应 XML 文档个方面的很多类型
Member of System.Xml.Linq
|
Meaning in Life
|
XAttribute
|
Represents an XML attribute on a given XML element
|
XComment
|
Represents an XML comment
|
XDeclaration
|
Represents the opening declaration of an XML document
|
XDocument
|
Represents the entirety of an XML document
|
XElement
|
Represents a given element within an XML document
|
XName/XNamespace
|
Provide a very simple manner to define and reference XML namespaces
|
二、编程方式创建XML文档
以前的 .NET XML编程模型需要使用很多冗长的 DOM API,而 LINQ to XML 则完全可以用与 DOM 无关的方式与 XML 文档交互。这样不但大大减少了代码行,而且这种编程模型可以直接映射到格式良好的XML文档结构。
static
void
CreateFunctionalXmlElement()
{
//
A "functional" approach to build an
//
XML element in memory.
XElement inventory
=
new
XElement(
"
Inventory
"
,
new
XElement(
"
Car
"
,
new
XAttribute(
"
ID
"
,
"
1
"
),
new
XElement(
"
Color
"
,
"
Green
"
),
new
XElement(
"
Make
"
,
"
BMW
"
),
new
XElement(
"
PetName
"
,
"
Stan
"
)
)
);
//
Call ToString() on our XElement.
Console.WriteLine(inventory);
}
在内存中创建XML文档
static
void
CreateFunctionalXmlDoc()
{
XDocument inventoryDoc
=
new
XDocument(
new
XDeclaration(
"
1.0
"
,
"
utf-8
"
,
"
yes
"
),
new
XComment(
"
Current Inventory of AutoLot
"
),
new
XElement(
"
Inventory
"
,
new
XElement(
"
Car
"
,
new
XAttribute(
"
ID
"
,
"
1
"
),
new
XElement(
"
Color
"
,
"
Green
"
),
new
XElement(
"
Make
"
,
"
BMW
"
),
new
XElement(
"
PetName
"
,
"
Stan
"
)
),
new
XElement(
"
Car
"
,
new
XAttribute(
"
ID
"
,
"
2
"
),
new
XElement(
"
Color
"
,
"
Pink
"
),
new
XElement(
"
Make
"
,
"
Yugo
"
),
new
XElement(
"
PetName
"
,
"
Melvin
"
)
)
)
);
//
Display the document and save to disk.
Console.WriteLine(inventoryDoc);
inventoryDoc.Save(
"
SimpleInventory.xml
"
);
}
三、使用
LINQ 查询创建XML文档
static
void
CreateXmlDocFromArray()
{
//
Create an anonymous array of anonymous types.
var data
=
new
[] {
new
{ PetName
=
"
Melvin
"
, ID
=
10
},
new
{ PetName
=
"
Pat
"
, ID
=
11
},
new
{ PetName
=
"
Danny
"
, ID
=
12
},
new
{ PetName
=
"
Clunker
"
, ID
=
13
}
};
//
Now enumerate over the array to build
//
an XElement.
XElement vehicles
=
new
XElement(
"
Inventory
"
,
from c
in
data
select
new
XElement(
"
Car
"
,
new
XAttribute(
"
ID
"
, c.ID),
new
XElement(
"
PetName
"
, c.PetName)
)
);
Console.WriteLine(vehicles);
}
四、加载和解析XML内容
static
void
LoadExistingXml()
{
//
Build an XElement from string.
string
myElement
=
@"
<Car ID ='3'>
<Color>Yellow</Color>
<Make>Yugo</Make>
</Car>
"
;
XElement newElement
=
XElement.Parse(myElement);
Console.WriteLine(newElement);
Console.WriteLine();
//
Load the SimpleInventory.xml file.
XDocument myDoc
=
XDocument.Load(
"
SimpleInventory.xml
"
);
Console.WriteLine(myDoc);
}
六、遍历内存中的XML文档
XML示例:
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
Inventory
>
<
Car carID
=
"
0
"
>
<
Make
>
Ford
</
Make
>
<
Color
>
Blue
</
Color
>
<
PetName
>
Chuck
</
PetName
>
</
Car
>
<
Car carID
=
"
1
"
>
<
Make
>
VW
</
Make
>
<
Color
>
Silver
</
Color
>
<
PetName
>
Mary
</
PetName
>
</
Car
>
<
Car carID
=
"
2
"
>
<
Make
>
Yugo
</
Make
>
<
Color
>
Pink
</
Color
>
<
PetName
>
Gipper
</
PetName
>
</
Car
>
<
Car carID
=
"
55
"
>
<
Make
>
Ford
</
Make
>
<
Color
>
Yellow
</
Color
>
862
CHAPTER
24
n PROGRAMMING WITH THE LINQ APIS
<
PetName
>
Max
</
PetName
>
</
Car
>
<
Car carID
=
"
98
"
>
<
Make
>
BMW
</
Make
>
<
Color
>
Black
</
Color
>
<
PetName
>
Zippy
</
PetName
>
</
Car
>
</
Inventory
>
加载
static
void
Main(
string
[] args)
{
Console.WriteLine(
"
***** Fun with LINQ to XML *****\n
"
);
//
Load the Inventory.xml document into memory.
XElement doc
=
XElement.Load(
"
Inventory.xml
"
);
//
We will author each of these next
PrintAllPetNames(doc);
Console.WriteLine();
GetAllFords(doc);
Console.ReadLine();
}
遍历
static
void
PrintAllPetNames(XElement doc)
{
var petNames
=
from pn
in
doc.Descendants(
"
PetName
"
)
select pn.Value;
foreach
(var name
in
petNames)
Console.WriteLine(
"
Name: {0}
"
, name);
}
查询
static
void
GetAllFords(XElement doc)
{
var fords
=
from c
in
doc.Descendants(
"
Make
"
)
where
c.Value
==
"
Ford
"
select c;
foreach
(var f
in
fords)
Console.WriteLine(
"
Name: {0}
"
, f);
}
七、修改 XML文档
static
void
AddNewElements(XElement doc)
{
//
Add 5 new purple Fords to the incoming document.
for
(
int
i
=
0
; i
<
5
; i
++
)
{
//
Create a new XElement
XElement newCar
=
new
XElement(
"
Car
"
,
new
XAttribute(
"
ID
"
, i
+
1000
),
new
XElement(
"
Color
"
,
"
Green
"
),
new
XElement(
"
Make
"
,
"
Ford
"
),
new
XElement(
"
PetName
"
,
""
)
);
//
Add to doc.
doc.Add(newCar);
}
//
Show the updates.
Console.WriteLine(doc);
}