将Object添加到现有Xelement

时间:2015-04-10 00:09:08

标签: c# xml xml-serialization

我有一个具有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

创建一个新的XElement
XElement 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);
    });

1 个答案:

答案 0 :(得分:1)

由于您可以使用XmlSerializer,因此请使用XmlRoot属性;尝试将以下内容添加到您的类声明中:

[XmlRoot(Namespace = "www.contoso.com", 
   ElementName = "CC", 
   DataType = "string", 
   IsNullable=true)]
public class MyObj
{
    ...

有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute%28v=vs.110%29.aspx

之后,您可以使用以下代码:

    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()