c# - C# Array of XmlElement 正在添加另一层嵌套
问题描述
我有以下情况:
- 返回 XML 的 4 个方法
- 必须用数组上的这 4 个 XML 片段创建一个大 XML
一个小例子如下:
<garage>
<owner>daniel</owner>
<cars>
<XmlElement>
<plate>ABC123</plate>
</XmlElement>
<XmlElement>
<plate>DSC563</plate>
</XmlElement>
<XmlElement>
<plate>AIO789</plate>
</XmlElement>
<XmlElement>
<plate>IUE692</plate>
</XmlElement>
</cars>
</garage>
我有一个数组plate
并想将其注入car
其中System.Xml.XmlElement[]
问题是,我似乎找不到一种方法来摆脱XmlElement
包裹我的对象的元素,我只是希望它像:
<garage>
<owner>
<name>daniel</name>
</owner>
<cars>
<plate>ABC123</plate>
<plate>DSC563</plate>
<plate>AIO789</plate>
<plate>IUE692</plate>
</cars>
</garage>
我尝试过使用 Xml 属性,但无法得到我想要的。
有人可以帮帮我吗?
这是工作代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using Xunit;
using Xunit.Abstractions;
namespace TestsProjec.XML
{
public class Tests
{
private readonly ITestOutputHelper _testOutputHelper;
public Tests(ITestOutputHelper testOutputHelper)
{
_testOutputHelper = testOutputHelper;
}
[Fact]
public void InjectingXml()
{
var serializer = new XmlSerializer(typeof(Garage));
var cars = new List<XmlElement>();
cars.Add(StringToXmlElement("<plate>ABC123</plate>"));
cars.Add(StringToXmlElement("<plate>DSC563</plate>"));
cars.Add(StringToXmlElement("<plate>AIO789</plate>"));
cars.Add(StringToXmlElement("<plate>IUE692</plate>"));
string fullXml;
var entity = new Garage()
{
owner = "Daniel",
cars = cars.ToArray()
};
using (MemoryStream ms = new MemoryStream())
{
using (XmlWriter tw = XmlWriter.Create(ms))
{
serializer.Serialize(tw, entity);
try
{
byte[] tmp = new byte[ms.Length - 3];
ms.Position = 3; //to skip the UTF-8 preamble
ms.Read(tmp, 0, (int)ms.Length - 3);
fullXml = Encoding.UTF8.GetString(tmp);
}
catch
{
fullXml = null;
}
}
}
_testOutputHelper.WriteLine(fullXml);
}
public XmlElement StringToXmlElement(string xml)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return doc.DocumentElement;
}
}
public class Garage
{
public string owner { get; set; }
public System.Xml.XmlElement[] cars { get; set; }
}
}
解决方案
如果您使用XElement
, 而不是XmlElement
,则可以通过XmlAnyElement
Attribute 获得所需的输出:
public class Garage
{
public string owner { get; set; }
[XmlAnyElement]
public XElement[] cars { get; set; }
}
您的方法StringToXmlElement
将如下所示:
public XElement StringToXmlElement(string xml)
{
return XElement.Parse(xml);
}
推荐阅读
- visual-studio - 我在 Visual Studio 中找不到 CLR 空项目
- swift - 来自 ARKit 的四舍五入位置数据
- mysql - MySQL递归深度在Nodejs中重置为0
- c++ - 有没有办法在 C++ 中的 If 语句中使用适当的布尔条件来停止初始化字符数组?
- c# - LINQ 动态地在哪里
- javascript - 在引导程序 4 行和列中对齐 fetch api 对象数组,使用 foreach 循环遍历数组
- react-native - React Native 平面列表 || 当在 TextInput 字段中按下时,VirtualizedList 从 0 个索引重新开始
- python - 使用 python 请求和可能的 concurrent.futures 来处理实时数据
- vuetify.js - 设置要在 Vuetify 主题颜色上使用的字体颜色
- rust - 如何使用 cpuid 找出 CPU 内核的数量?