使用 C# 创建 XML 树 (LINQ to XML)
本节提供有关使用 C# 来创建 XML 树的信息。
有关使用 LINQ 查询结果作为 XElement 的内容的信息,请参见函数构造 (LINQ to XML)。
构造元素
通过 XElement 和 XAttribute 构造函数的签名,可以将元素或属性的内容作为参数传递到构造函数。 由于其中一个构造函数使用可变数目的参数,因此可以传递任意数目的子元素。 当然,这些子元素中的每一个都可以包含它们自己的子元素。 对任意元素,可以添加任意多个属性。
在添加 XNode(包括 XElement)或 XAttribute 对象时,如果新内容没有父级,则直接将这些对象附加到 XML 树中。 如果新内容已经有父级,并且是另一 XML 树的一部分,则克隆新内容,并将新克隆的内容附加到 XML 树。 本主题最后一个示例对此进行了演示。
若要创建 contacts XElement,可以使用下面的代码:
XElement contacts =
new XElement("Contacts",
new XElement("Contact",
new XElement("Name", "Patrick Hines"),
new XElement("Phone", "206-555-0144"),
new XElement("Address",
new XElement("Street1", "123 Main St"),
new XElement("City", "Mercer Island"),
new XElement("State", "WA"),
new XElement("Postal", "68042")
)
)
);
如果正确缩进,则构造 XElement 对象的代码十分类似于基础 XML 的结构。
Visual Basic 具有另一种创建 XML 树的方法:可以直接在 Visual Basic 程序中将 XML 作为 XML 文本嵌入。 有关更多信息,请参见 Visual Basic 中的 XML 文本简介。
XElement 构造函数
XElement 类使用下面的构造函数用于函数构造。 请注意,对于 XElement,存在其他一些构造函数,但是由于它们不用于函数构造,因此没有在此列出。
构造函数 |
说明 |
---|---|
XElement(XName name, object content) |
创建一个 XElement。 name 参数指定元素的名称;content 指定元素的内容。 |
XElement(XName name) |
|
XElement(XName name, params object[] content) |
content 参数极其灵活。 它支持作为 XElement 的有效子对象的任何类型的对象。 下面的规则适用于在此参数中传递的不同类型的对象:
字符串添加为文本内容。
XElement 添加为子元素。
XAttribute 添加为属性。
XProcessingInstruction、XComment 或 XText 添加为子内容。
枚举 IEnumerable,并且这些规则递归应用于结果。
对任何其他类型,调用其 ToString 方法,结果添加为文本内容。
创建包含内容的 XElement
可以使用单个方法调用来创建一个包含简单内容的 XElement。 为此,请指定内容作为第二个参数,如下所示:
XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);
此示例产生以下输出:
<Customer>Adventure Works</Customer>
可以将任意类型的对象作为内容进行传递。 例如,下面的代码创建一个包含浮点数作为内容的元素:
XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);
此示例产生以下输出:
<Cost>324.5</Cost>
该浮点数被装箱并传递给构造函数。 装箱的数字转换为字符串,然后用作元素的内容。
创建具有子元素的 XElement
如果传递 XElement 类的一个实例作为内容参数,则构造函数将创建一个具有子元素的元素:
XElement shippingUnit = new XElement("ShippingUnit",
new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);
此示例产生以下输出:
<ShippingUnit>
<Cost>324.5</Cost>
</ShippingUnit>
创建具有多个子元素的 XElement
可以传递多个 XElement 对象作为内容。 每个 XElement 对象都作为子元素包含进来。
XElement address = new XElement("Address",
new XElement("Street1", "123 Main St"),
new XElement("City", "Mercer Island"),
new XElement("State", "WA"),
new XElement("Postal", "68042")
);
Console.WriteLine(address);
此示例产生以下输出:
<Address>
<Street1>123 Main St</Street1>
<City>Mercer Island</City>
<State>WA</State>
<Postal>68042</Postal>
</Address>
将上面的示例进行扩展,可以创建整个 XML 树,如下所示:
XElement contacts =
new XElement("Contacts",
new XElement("Contact",
new XElement("Name", "Patrick Hines"),
new XElement("Phone", "206-555-0144"),
new XElement("Address",
new XElement("Street1", "123 Main St"),
new XElement("City", "Mercer Island"),
new XElement("State", "WA"),
new XElement("Postal", "68042")
)
)
);
Console.WriteLine(contacts);
此示例产生以下输出:
<Contacts>
<Contact>
<Name>Patrick Hines</Name>
<Phone>206-555-0144</Phone>
<Address>
<Street1>123 Main St</Street1>
<City>Mercer Island</City>
<State>WA</State>
<Postal>68042</Postal>
</Address>
</Contact>
</Contacts>
创建空元素
若要创建空 XElement,请不要将任何内容传递给构造函数。 下面的示例创建一个空元素:
XElement n = new XElement("Customer");
Console.WriteLine(n);
此示例产生以下输出:
<Customer />
附加与克隆
前面提到,在添加 XNode(包括 XElement)或 XAttribute 对象时,如果新内容没有父级,则直接将这些对象附加到 XML 树。 如果新内容已经有父级,并且是另一 XML 树的一部分,则克隆新内容,并将新克隆的内容附加到 XML 树。
// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
new XElement("Child1", 1)
);
// Create an element that is not parented.
XElement child2 = new XElement("Child2", 2);
// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
xmlTree1.Element("Child1"),
child2
);
// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
"attached" : "cloned");
// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
child2 == xmlTree2.Element("Child2") ?
"attached" : "cloned");
此示例产生以下输出:
Child1 was cloned
Child2 was attached