XmlElement 的 C# 数组正在添加另一层嵌套

标签 c# .net xml serialization xml-serialization

我有以下情况:

  • 4 个返回 XML 的方法
  • 必须用数组中的这 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 数组,想将它注入(inject)到 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 属性:

public class Garage
{
    public string owner { get; set; }
    [XmlAnyElement]
    public XElement[] cars { get; set; }
}

您的方法 StringToXmlElement 将如下所示:

public XElement StringToXmlElement(string xml)
{
    return XElement.Parse(xml);
}

关于XmlElement 的 C# 数组正在添加另一层嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56949443/

相关文章:

c# - MVC : how to correctly serve multiple domain names from one site (different content for each)

c# - 循环推送值列表的 Observable

c# - 使用 Visual Studio Designer 在 TableLayoutPanel 中居中 Windows 窗体控件

c# - RichTextBox 中的 HTML 格式

xml - 使用单个 XSL 流将一个大型 XML 文件拆分为多个文件

c# - linq 查询的返回数据类型

c# - 对单个 DataGridView 列的验证

c# - ASP.net 文本框在禁用时滚动

asp.net - 您如何决定将模型数据从 asp.net mvc Controller 传递到 View 的方式?

android - 无法在选项卡中自定义 android 图标和文本