命名空间
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XAttribute("aw", "http://www.adventure-works.com"),
"Content");
Console.WriteLine(root);
使用 LINQ to XML 时,仅在文档的根级别添加注释或处理说明时,才需使用 XDocument 类。
XDocument srcTree = new XDocument(
new XComment("This is a comment"),
new XElement("Root",
new XElement("Child1", "data1"),
new XElement("Child2", "data2"),
new XElement("Child3", "data3"),
new XElement("Child2", "data4"),
new XElement("Info5", "info5"),
new XElement("Info6", "info6"),
new XElement("Info7", "info7"),
new XElement("Info8", "info8")
)
);
//注意element可以直接强转成对应的值
初始化 最常用的两种方法
一种是上面那种,另外一种使用 LINQ 查询的结果来填充 XML 树
XElement srcTree = new XElement("Root",
new XElement("Element", 1),
new XElement("Element", 2),
new XElement("Element", 3),
new XElement("Element", 4),
new XElement("Element", 5)
);
XElement xmlTree = new XElement("Root",
new XElement("Child", 1),
new XElement("Child", 2),
from el in srcTree.Elements()
where (int)el > 2
select el
);
Console.WriteLine(xmlTree);
序列化的时候留白
string str;
XElement root = XElement.Parse(@"<Root> <Child> Text </Child> </Root>");
root.Save("Root.xml", SaveOptions.DisableFormatting);
str = File.ReadAllText("Root.xml");
Console.WriteLine(str);
Console.WriteLine("=====");
root.Save("Root.xml", SaveOptions.None);
str = File.ReadAllText("Root.xml");
Console.WriteLine(str);
正常输出XML内容的时候是自带XML声明的
下面演示 输出时不自带XML声明的例子
StringBuilder sb = new StringBuilder();
XmlWriterSettings xws = new XmlWriterSettings();
xws.OmitXmlDeclaration = true;
using (XmlWriter xw = XmlWriter.Create(sb, xws))
{
XElement root = new XElement("Root",
new XElement("Child",
new XElement("c1","c1"),
new XElement("c2","c2"))
);
root.Save(xw);
}
Console.WriteLine(sb.ToString());
循环所有节点的名称
string path = Path.Combine(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName, @"static\PurchaseOrder.xml");
XElement xe = XElement.Load(path);
foreach(var i in xe.Elements())
{
Console.WriteLine(i.Name);
}
检索元素的值
只需将 XElement 对象强制转换为所需的类型即可。 任何时候都可以将元素强制转换为字符串
XElement xe = new XElement("nodename","nodevalue");
Console.WriteLine("name is "+xe.Name+" value si "+(string)xe);
有的时候节点可能存在或者不存在,使用的时候我们需要检查
string c1 = (string)root.Element("Child1");
Console.WriteLine("c1:{0}", c1 == null ? "element does not exist" : c1);
int? c2 = (int?)root.Element("Child2");
Console.WriteLine("c2:{0}", c2 == null ? "element does not exist" : c2.ToString());
获取指定名称的所有节点
Descendants("ProductName")
查找所有 PurchaseOrder 元素中的所有 Address 元素Name元素的值。
IEnumerable<XElement> names =
from el in purchaseOrders .Elements("PurchaseOrder") .Elements("Address") .Elements("Name") select el;
foreach (XElement e in names) Console.WriteLine(e);
创建包含指定元素属性的节点
XElement val = new XElement("Value", new XAttribute("ID", "1243"), new XAttribute("Type", "int"), new XAttribute("ConvertableTo", "double"), "100"); IEnumerable<XAttribute> listOfAttributes = from att in val.Attributes() select att; foreach (XAttribute a in listOfAttributes) Console.WriteLine(a);
或者
XElement val = new XElement("Value",
new XAttribute("ID", "1243"),
new XAttribute("Type", "int"),
new XAttribute("ConvertableTo", "double"),
new XElement("v1","v1"),new XElement("v2","v2"));
循环
var e=XElement.Load(path);
foreach(var attr in e.Attributes())
{
//Console.WriteLine((string)attr);// value
//Console.WriteLine(attr); //XX="XX"
Console.WriteLine(attr.Name+" "+attr.Value);
}
检索单个属性
XElement cust = new XElement("PhoneNumbers", new XElement("Phone", new XAttribute("type", "home"), "555-555-5555"), new XElement("Phone", new XAttribute("type", "work"), "555-555-6666") ); IEnumerable<XElement> elList = from el in cust.Descendants("Phone") select el; foreach (XElement el in elList) Console.WriteLine((string)el.Attribute("type"));
elements Descendants 之间的区别
elements 只能查询根节点下面次一级的节点
Descendants 可以直接查询根节点下面想要的节点
计算中间值
XElement root = XElement.Load("Data.xml"); IEnumerable<decimal> extensions = from el in root.Elements("Data") let extension = (decimal)el.Element("Quantity") * (decimal)el.Element("Price") where extension >= 25 orderby extension select extension; foreach (decimal ex in extensions) Console.WriteLine(ex);