将对象添加到现有的 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()
。
我有一个具有 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()
。