将对象添加到现有的 Xelement

Add Object to existing Xelement

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

既然您愿意使用 XmlSerializer,请使用 XmlRoot 属性;尝试将以下内容添加到您的 class 声明中:

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