我有一个具有2个属性p1,p2的对象obj。和XElement一样:
<root><AA><BB>BB</BB></AA></root>
我想把我的Xelement作为:
<root><AA><BB>BB</BB><CC><p1>val1</p1><p2>val2</p2></CC></AA></root>
我从obj
创建一个新的XElementXElement x = new XElement("CC",new XElement("p1", obj.p1),new XElement("p2", obj.p2));
并将其插入AA元素中。通过序列化我的obj并将其转换为XElement是一个更好的方法吗? (因为我的对象将来可以改变)。谢谢你的帮助。 这是我尝试使用XmlSerializer:
XElement xelem = reqRet.RequestDefinition;
xelem.Descendants("AA").ToList().ForEach(reqitem =>
{
using (MemoryStream ms = new MemoryStream())
{
using (TextWriter tw = new StreamWriter(ms))
{
XmlSerializer ser = new XmlSerializer(typeof(obj));
ser.Serialize(tw, ObjVAL);
schElem = new XElement( XElement.Parse(Encoding.ASCII.GetString(ms.ToArray())));
reqitem.Add(schElem);
}
}
reqitem.Add(schElem);
});
答案 0 :(得分:1)
由于您可以使用XmlSerializer
,因此请使用XmlRoot
属性;尝试将以下内容添加到您的类声明中:
[XmlRoot(Namespace = "www.contoso.com",
ElementName = "CC",
DataType = "string",
IsNullable=true)]
public class MyObj
{
...
之后,您可以使用以下代码:
XElement xelem = XElement.Parse("<root><AA><BB>BB</BB></AA></root>");
MyObj myObj = new MyObj();
XmlSerializer ser = new XmlSerializer(typeof(MyObj));
foreach (XElement reqitem in xelem.Descendants("AA"))
{
using (MemoryStream ms = new MemoryStream())
{
ser.Serialize(ms, myObj);
reqitem.Add(XElement.Parse(Encoding.UTF8.GetString(ms.ToArray())));
}
}
这给出了所需的输出。
如果要删除XMLNS声明,可以在创建XElement后使用.Attributes.Remove()
。