【问题标题】:file xml inside multiple xml in one line一行中的多个 xml 中的文件 xml
【发布时间】:2021-11-07 14:54:40
【问题描述】:

我在一行中的多个 xml 中有一个文件 .xml。 如何读取此文件并转换为对象? 我尝试使用此代码,如果只有一个,它就可以工作。 请大家帮忙,谢谢大家

[XmlRoot(ElementName = "DepartmentMaster")]
public class DepartmentMaster
{
    [XmlElement(ElementName = "DepartmentId")]
    public int DepartmentId { get; set; }

    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }

    [XmlElement(ElementName = "Description")]
    public string Description { get; set; }

    [XmlElement(ElementName = "test")]
    public int Test { get; set; }
}

//string xml = "<DepartmentMaster><DepartmentId>267854</DepartmentId><Name>Purchase</Name><Description>Purchase Department</Description><test>1</test></DepartmentMaster>";

 string xml = "<DepartmentMaster><DepartmentId>267854</DepartmentId><Name>Purchase</Name><Description>Purchase Department</Description><test>1</test></DepartmentMaster><DepartmentMaster><DepartmentId>267855</DepartmentId><Name>Purchase5</Name><Description>Purchase Department5</Description><test>5</test></DepartmentMaster>";

using (TextReader reader = new StringReader(xml))
{
    System.Xml.Serialization.XmlSerializer deserializer = new System.Xml.Serialization.XmlSerializer(typeof(DepartmentMaster));
    var model = (DepartmentMaster)deserializer.Deserialize(reader);
}

image from the database

image from the database

【问题讨论】:

  • 这不是一个有效的 XML 文档。 XML 文档必须有一个根元素。您可以尝试将字符串包装成“...”。
  • 是数据库中的一个表。它以相同的方式编写。我正在尝试上传带有主题的图片。但它没有出现
  • 如果你想使用 XmlSerializer,你需要从有效的 XML 开始——你需要一个根元素。
  • 我添加了一个指向数据库中表格图像的链接
  • XML 规范允许在根目录中使用一组标签。不要听别人说不同。当您在根目录中有一个数组时,它不是“格式良好”,而是有效的。有两种解决方案。 1)向字符串添加根。 string wellFormed = "" + xml + "; 2) Net 库确实喜欢格式正确的数据。所以您需要使用带有 XmlReaderSetting 的 XmlReader,如下所示: XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment;

标签: c# xml xmlserializer


【解决方案1】:

下面是两种方法。

第一种是使用设置来接受具有多个根元素的 XML 数据(ConformanceLevel.Fragment)。

private static IList<DepartmentMaster> DeserializeFragment(string xml)
{
    var settings = new XmlReaderSettings
    {
        ConformanceLevel = ConformanceLevel.Fragment
    };
    
    XmlReader reader = XmlReader.Create(new MemoryStream(Encoding.ASCII.GetBytes(xml)), settings);
    var serializer = new XmlSerializer(typeof(DepartmentMaster));
    
    var list = new List<DepartmentMaster>();
    while (serializer.Deserialize(reader) is DepartmentMaster element)
    {
        list.Add(element);
    }
    return list;
}

第二个是通过添加根元素来反序列化格式良好的 XML 文档。

public class DepartmentMasters
{
    [XmlElement("DepartmentMaster")]
    public List<DepartmentMaster> Items;
}

private static DepartmentMasters DeserializeWellFormedXML(string xml)
{
    var text = @"<?xml version=""1.0""?><DepartmentMasters>" + xml + "</DepartmentMasters>";
    var serializer = new XmlSerializer(typeof(DepartmentMasters));
    return (DepartmentMasters)serializer.Deserialize(new StringReader(text));
}

【讨论】:

  • 该链接用于序列化,而不是反序列化。除非您使用我在主线程中所述的 Fragment 设置,否则代码将无法在根目录下运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多