xml-deserialization 相关问题

XML反序列化是从其序列化状态重新创建内存中对象的过程,该状态使用XML作为数据格式。

C# 使用属性和值将 JSON 转换为 XML

我有一个如下所示的json { “标题”:空, “项目名”: { "@Label": "项目名称", “价值”: ””, “@

回答 1 投票 0

如何将 XML 反序列化为 C# 对象而忽略 xmlns?

给定以下 XML,我如何将它们反序列化为同一个 C# 对象?版本 1.1 本质上向后兼容 1.0,所以我并不真正关心 xmlns 值,但 C# 不这么认为...

回答 1 投票 0

在 C# 中使用混合元素顺序反序列化/序列化 XML 时出现问题

我在将 XML 反序列化/序列化为 C# 对象时遇到问题。 XML 结构具有混合的元素顺序,我遇到了具有相同名称但

回答 1 投票 0

是否可以在不使用 linq-to-xml 的情况下将 xml 反序列化为字典?

我想反序列化 xml 文件。这是有问题的 xml 文件: 我想反序列化 xml 文件。这是有问题的 xml 文件: <MessageList category="Alarm" version="1.0.0"> <Item id="1"> <Message key="Level" text="Alarm" /> <Message key="Title" text="ERROR AT PLC UNIT" /> <Message key="Detail" text="Change PLC unit. &#xD;&#xA;If it is out of order. please contact our service man." /> </Item> <Item id="2"> <Message key="Level" text="Alarm" /> <Message key="Title" text="RE-SET PLC UNIT ( PROGRAM FS )" /> <Message key="Detail" text="Turn off and restart. if the problem persists. check thet the switch on the controller is in RUN mode. &#xD;&#xA;If it is out of order. please contact our service man." /> </Item> <Item id="3"> <Message key="Level" text="Alarm" /> <Message key="Title" text="" /> <Message key="Detail" text="" /> </Item> <Item id="4"> <Message key="Level" text="Alarm" /> <Message key="Title" text="" /> <Message key="Detail" text="" /> </Item> <Item id="5"> <Message key="Level" text="Alarm" /> <Message key="Title" text="" /> <Message key="Detail" text="" /> </Item> 是否可以在不使用 linq-to-xml 的情况下将 xml 反序列化为字典? 你好,我想反序列化一个 xml 文件。这是有问题的 xml 文件 我想获得如下所示的两个课程。链接到 MessageList 的类,其中包含所有其他 Items 元素。 您可能已经注意到,所有项目都有一个代表它们的唯一 ID。所以我想将它用作字典键并将消息元素包含在列表中作为字典值。 class MessageListClass { public string category { get; set; } public string version { get; set; } public List< Dictionary<int, List<Message> > > items { get; set; } } public class Message { public string key { get; set; } public string text { get; set; } } 目前,我已经使用 System.Xml.Serialization 中的属性以这种方式完成了。它运作良好,但它们不是字典。有没有办法使用 System.Xml.Serialization 属性而不是 Linq-to-Xml 来获取像我想要的字典? [XmlRoot("MessageList")] class MessageList { [XmlAttribute("category")] public string category { get; set; } [XmlAttribute("version")] public string version { get; set; } [XmlElement("Item")] public List<Item> items { get; set; } } public class Item { [XmlAttribute("id")] public int alarmId { get; set; } [XmlElement("Message")] public List<Message> messages { get; set; } } public class Message { [XmlAttribute("key")] public string key { get; set; } [XmlAttribute("text")] public string text { get; set; } } 我建议为序列化和其他用途保留单独的模型。这对于模型不完全匹配的情况很有帮助。专用于序列化的类有时称为“数据传输对象”或“DTO”。 您可以添加一种方法以从一种模型转换为另一种模型: class MessageListDTO { [XmlAttribute("category")] public string Category { get; set; } [XmlAttribute("version")] public string Version { get; set; } [XmlElement("Item")] public List<ItemDTO> Items { get; set; } public MessageList ToModel(){ return new MessageList(){ Category = Category, Version = Version, Items = Items.ToDictionary( i => i.AlarmId , i => i.Messages.Select(m => m.ToModel()).ToList()) }; }

回答 1 投票 0

XML 反序列化:如果存在两个元素,我如何才能优先于另一个元素绑定到一个元素?

我需要反序列化包含以下三种形式之一的元素的 XML: xxx 或者 xxx 或者 xxx 我需要反序列化包含以下三种形式之一的元素的 XML: <Element1>xxx</Element1> 或 <Element2>xxx</Element2> 或 <Element1>xxx</Element1> <Element2>xxx</Element2> 如果两者都存在,我需要优先使用 Element1 的值而不是 Element2。我怎样才能做到这一点? 我正在使用 System.Xml.Serialization 来解析 xml 这是我的财产 [XmlElement("Element1")] [XmlElement("Element2")] public string Data { get { return this.data; } set { this.data = value; } } 就我而言,如果两者都存在,我需要使用 Element1,否则使用存在的那个。 我无法想出解决方案。 试试这个。 public class Parent : IXmlSerializable { public string data { get; set; } public void WriteXml(XmlWriter writer) { writer.WriteString(data); } public void ReadXml(XmlReader reader) { XElement node = (XElement)XElement.ReadFrom(reader); XElement element1 = node.Element("Element1"); XElement element2 = node.Element("Element2"); if(element1 == null) { data = (string)element2; } else { data = (string)element1; } } public XmlSchema GetSchema() { return (null); } } 有很多方法可以解决您的问题。 其中之一是使用 UnknownElement 事件。 using System.Xml.Serialization; var ser = new XmlSerializer(typeof(Root)); ser.UnknownElement += Serializer_UnknownElement; void Serializer_UnknownElement(object? sender, XmlElementEventArgs e) { var root = (Root)e.ObjectBeingDeserialized; var elem = e.Element; if (elem.Name == "Element1") root.Data = elem.InnerText; else if (elem.Name == "Element2" && root.Data == null) root.Data = elem.InnerText; } using var fs = new FileStream("test.xml", FileMode.Open); var root = (Root)ser.Deserialize(fs); Console.WriteLine(root.Data); public class Root { public string Data { get; set; } } 另一种方法是使用自定义读取器来动态替换数据。 using System.Xml; using System.Xml.Serialization; var ser = new XmlSerializer(typeof(Root)); using var reader = new CustomXmlReader("test.xml"); var root = (Root)ser.Deserialize(reader); Console.WriteLine(root.Data); public class CustomXmlReader : XmlTextReader { public CustomXmlReader(string url) : base(url) { } private bool dataRead; public override string LocalName { get { if (base.LocalName == "Element1") { dataRead = true; return "Data"; } else if (base.LocalName == "Element2" && !dataRead) return "Data"; return base.LocalName; } } } public class Root { public string Data { get; set; } }

回答 2 投票 0

Xml反序列化c#,如果存在两个元素需要使用特定元素

xxx 或者 xxx 或者 xxx xxx 如果两者都存在,我需要使用

回答 1 投票 0

在 C# 中反序列化时出现 InvalidOperationException

我正在使用基于 XML 的 .config 文件来存储一些记录。我的 XML 如下: 我正在使用基于 XML 的 .config 文件来存储一些记录。我的 XML 如下: <?xml version="1.0" encoding="utf-8"?> <Data_List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Configuration> <Name>1st Week</Name> <Binary> <Field>field1</Field> <Version>1.0</Version> </Binary> <Binary> <Field>field2</Field> <Version>2.0</Version> </Binary> </Configuration> <Configuration> <Name>2nd Week</Name> <Binary> <Field>field1</Field> <Version>2.0</Version> </Binary> <Binary> <Field>field2</Field> <Version>4.0</Version> </Binary> </Configuration> </Data_List> 我使用 C# 代码如下: public Binary { public String Field; public String Version; } public Configuration { public String Name; public List<Binary> Binary_List = new List<Binary>(); public GetfromXML() { List<Configuration> lists = new List<Configuration>(); TextReader reader = new StreamReader("Data_List.config"); XmlSerializer serializer = new XmlSerializer(typeof(List<Configuration>)); lists=(List<Configuration>)serializer.Deserialize(reader); reader.Close(); } 我收到异常消息“XML 文档(2,2) 中存在错误”。我该如何解决它? 我认为问题在于你的模型结构不佳。换句话说,序列化程序不知道如何读取您的 .xml。 您的 xml 错误。当你有 List< T > 时,会有一个: <ArrayOfT></ArrayOfT> 在 .XML 中。这是你需要做的! 首先,尝试使用 System.Xml.Serialization 中的 xml 属性(即 [XmlArray()]) 最好使用 FileStream 而不是仅仅指出 URI using(var filestream = new FileStream(//your uri, FIleMode.Open) { } 使用属性而不是变量。因为稍后您可能想要绑定。 我如何设法解决该问题的代码示例: public ServiceMap Deserialize() { ServiceMap serviceMap = new ServiceMap(); try { using (var fileStream = new FileStream(Settings.ServiceMapPath, FileMode.Open)) { XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; using (XmlReader reader = XmlReader.Create(fileStream, settings)) { serviceMap = _serializer.Deserialize(reader) as ServiceMap; } } } catch (FileNotFoundException) { MessageBox.Show("File 'ServiceMap.xml' could not be found!"); } return serviceMap; } 我的 ServiceMap 类: [XmlRoot("ServiceMap")] public class ServiceMap { [XmlArray("Nodes")] [XmlArrayItem("Node")] public List<Node> Nodes = new List<Node>(); [XmlArray("Groups")] [XmlArrayItem("Group")] public List<Group> Groups = new List<Group>(); [XmlArray("Categories")] [XmlArrayItem("Category")] public List<Category> Categories = new List<Category>(); } 编辑:我的XML: <?xml version="1.0" encoding="utf-8"?> <ServiceMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:// www.w3.org/2001/XMLSchema"> <Nodes> <Node Name="Predrag"> <Children> <Child>dijete1</Child> <Child>dijete2</Child> <Child>dijete3</Child> <Child>dijete4</Child> </Children> <Parents> <Parent>roditelj1</Parent> <Parent>roditelj2</Parent> <Parent>roditelj3</Parent> </Parents> <Group Name="Grupa" /> <Category Name="Kategorija" /> </Node> <Node Name="Tami"> <Children> <Child>dijete1</Child> <Child>dijete2</Child> </Children> <Parents> <Parent>roditelj1</Parent> </Parents> <Group Name="Grupa2" /> <Category Name="Kategorija2" /> </Node>

回答 1 投票 0

具有所有属性的控件的(反)序列化

我正在尝试序列化控件的所有属性,对于初学者,我从 Devexpress 的 TextEdit 控件开始。但是,TextBox 控件也会出现同样的问题。连载已通过...

回答 1 投票 0

使用本机 AOT 进行 Xml 反序列化

我想将xml文档反序列化为c#对象。 Xml文档示例 我想将 xml 文档反序列化为 c# 对象。 Xml文档示例 <XtraSerializer version="1.0" application="LayoutControl"> <property name="#LayoutVersion" /> <property name="OptionsFocus" isnull="true" iskey="true"> <property name="ActivateSelectedControlOnGotFocus">true</property> <property name="AllowFocusControlOnLabelClick">false</property> <property name="EnableAutoTabOrder">true</property> <property name="AllowFocusControlOnActivatedTabPage">false</property> <property name="AllowFocusGroups">true</property> <property name="AllowFocusTabbedGroups">true</property> <property name="AllowFocusReadonlyEditors">true</property> <property name="MoveFocusRightToLeft">false</property> <property name="MoveFocusDirection">AcrossThenDown</property> </property> <property name="Items" iskey="true" value="2"> <property name="Item1" isnull="true" iskey="true"> <property name="TypeName">LayoutGroup</property> <property name="TabbedGroupParentName" /> <property name="GroupBordersVisible">false</property> <property name="AllowDrawBackground">true</property> <property name="EnableIndentsWithoutBorders">True</property> <property name="OptionsItemText" isnull="true" iskey="true"> <property name="TextToControlDistance">4</property> <property name="TextAlignMode">UseParentOptions</property> </property> <property name="CaptionImageVisible">true</property> <property name="FlowDirection">LeftToRight</property> <property name="LayoutMode">Regular</property> <property name="CaptionImageLocation">Default</property> <property name="CaptionImageIndex">-1</property> <property name="AllowBorderColorBlending">false</property> <property name="ExpandOnDoubleClick">false</property> <property name="Expanded">true</property> <property name="DefaultLayoutType">Vertical</property> <property name="ShowTabPageCloseButton">false</property> <property name="AllowHtmlStringInCaption">false</property> <property name="AllowGlyphSkinning">Default</property> <property name="OptionsTableLayoutGroup" isnull="true" iskey="true"> <property name="RowDefinitions" iskey="true" value="0" /> <property name="ColumnDefinitions" iskey="true" value="0" /> </property> <property name="Size">@4,Width=1318@3,Height=554</property> <property name="ExpandButtonVisible">false</property> <property name="ExpandButtonMode">Normal</property> <property name="HeaderButtonsLocation">Default</property> <property name="GroupStyle">Inherited</property> <property name="TextLocation">Top</property> <property name="TabPageWidth">0</property> <property name="OptionsCustomization" isnull="true" iskey="true"> <property name="AllowDrag">Default</property> <property name="AllowDrop">Default</property> </property> <property name="OptionsTableLayoutItem" isnull="true" iskey="true"> <property name="RowIndex">0</property> <property name="RowSpan">1</property> <property name="ColumnIndex">0</property> <property name="ColumnSpan">1</property> </property> <property name="OptionsToolTip" isnull="true" iskey="true"> <property name="ToolTip" /> <property name="ToolTipTitle" /> <property name="ToolTipIconType">None</property> <property name="ImmediateToolTip">false</property> <property name="AllowHtmlString">Default</property> <property name="IconToolTip" /> <property name="IconToolTipTitle" /> <property name="IconToolTipIconType">None</property> <property name="EnableIconToolTip">true</property> <property name="IconImmediateToolTip">false</property> <property name="IconAllowHtmlString">Default</property> </property> <property name="Name">Root</property> <property name="ParentName" /> <property name="TextVisible">false</property> <property name="Location">@1,X=0@1,Y=0</property> <property name="ShowInCustomizationForm">true</property> <property name="Text">Root</property> <property name="CustomizationFormText">Root</property> <property name="StartNewLine">false</property> <property name="Visibility">Always</property> </property> </property> </XtraSerializer> 现在我想从 xml 字符串反序列化为 c# 对象。 [XmlRoot(ElementName = "property")] public class Property { [XmlAttribute(AttributeName = "name")] public string Name { get; set; } [XmlText] public string Text { get; set; } [XmlElement(ElementName = "property")] public List<Property> property { get; set; } } [XmlRoot(ElementName = "XtraSerializer")] public class XtraSerializer { [XmlElement(ElementName = "property")] public List<Property> Property { get; set; } [XmlText] public string Text { get; set; } } XtraSerializer GetXtraSerializer(string xml) { XmlSerializer serializer = new XmlSerializer(typeof(XtraSerializer)); using StringReader reader = new (xml); return (XtraSerializer)serializer.Deserialize(reader); } 发布前运行正常。使用本机 AOT 发布后会发生异常。 XML 文档 (0, 0) 中有错误。 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader,字符串编码样式,XmlDeserializationEvents 事件) 以下代码有效。我所做的就是更改 StringReader : using System; using System.Collections.Generic; using System.Linq; using System.Xml; using System.Xml.Serialization; using System.IO; namespace ConsoleApp10 { class Program { const string FILENAME = @"c:\temp\test.xml"; static void Main(string[] args) { string xml = File.ReadAllText(FILENAME); XtraSerializer xtra = GetXtraSerializer(xml); } static XtraSerializer GetXtraSerializer(string xml) { XmlSerializer serializer = new XmlSerializer(typeof(XtraSerializer)); StringReader reader = new StringReader(xml); return (XtraSerializer)serializer.Deserialize(reader); } } [XmlRoot(ElementName = "property")] public class Property { [XmlAttribute(AttributeName = "name")] public string Name { get; set; } [XmlText] public string Text { get; set; } [XmlElement(ElementName = "property")] public List<Property> property { get; set; } } [XmlRoot(ElementName = "XtraSerializer")] public class XtraSerializer { [XmlElement(ElementName = "property")] public List<Property> Property { get; set; } [XmlText] public string Text { get; set; } } } 我为此使用了Newtonsoft。首先我转换为 json,然后转换为 c# 对象。

回答 2 投票 0

将 Python 对象转换为不带命名空间的 XML

我正在使用 xsdata 中的 XmlSerializer 将 python3.9 数据类对象转换为 XML。 这是代码 # 创建序列化器 XML_SERIALIZER = XmlSerializer(config=SerializerConfig(xml_declaration=

回答 1 投票 0

解决WCF DataContract DataMember Order反序列化问题

与遗留 WCF 接口的一个用例是将所有 .NET 服务代码隐藏在更现代的 RESTful API 后面,我们将(看似正确的)XML 发布到该 API,并将其反序列化为 WCF 类...

回答 1 投票 0

从 XML 响应转换为列表

XElement Xml = null; var apiResponse = response.Content.ReadAsStringAsync().Result; Xml = Newtonsoft.Json.JsonConvert.DeserializeObject(apiResponse); 来自上述公司的 XML 响应...

回答 2 投票 0

C# XmlSerializer 不会反序列化所有类属性

我在 C# 中有这个类: [XmlRoot("响应")] 公开课回应 { [XmlElement(ElementName = "文档")] 公共文档文档{获取;放; } [Xml元素(

回答 1 投票 0

C# 反序列化 CBISDDStsRptPhyMsg

我需要反序列化遵循 CBI 意大利语标准的 XML,问题是我已经用命名空间标记了每个类,但我仍然无法反序列化。 这是...的一部分

回答 2 投票 0

无法使用有序元素反序列化带有 xml 注释的 XML

如果我反序列化包含注释元素的 XML 并将其反序列化为具有有序属性的类,我会得到异常: XML 文档 (4, 25) 中存在错误。 无法投射

回答 0 投票 0

我无法反序列化以下 XML 文件

我正在尝试反序列化 XML 文件。 XML 的相关部分如下。 XML 文件: 我正在尝试反序列化 XML 文件。 XML 的相关部分如下。 XML 文件: <?xml version="1.0" encoding="utf-8"?> <LandXML xmlns="http://www.landxml.org/schema/LandXML-1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.landxml.org/schema/LandXML-1.2 http://www.landxml.org/schema/LandXML-1.2/LandXML-1.2.xsd" version="1.2" date="2022-06-22" time="16:31:46.94" readOnly="false" language="English"> <Units> <Metric linearUnit="meter" areaUnit="squareMeter" volumeUnit="cubicMeter" angularUnit="decimal dd.mm.ss" latLongAngularUnit="decimal degrees" temperatureUnit="celsius" pressureUnit="milliBars"/> </Units> ... 我的班级: using System; using System.Xml.Serialization; namespace MLS.SpatialViz.Hexagon { [Serializable] [XmlRoot(ElementName = "LandXML", IsNullable = true)] public class LandXML { [XmlElement(ElementName = "Units")] public Units Units { get; set; } } public class Units { [XmlAttribute(AttributeName = "linearUnit")] public string LinearUnit { get; set; } } } 我正在尝试将“meter”写入控制台。它运行但没有写入任何值。 public static void DeserealizeXML() { string FileName = @"D:\Temp\824ABF00.xml"; XmlSerializer serializer = new XmlSerializer(typeof(Hexagon.LandXML)); Hexagon.LandXML landXML; using (XmlTextReader xmlReader = new XmlTextReader(FileName)) { xmlReader.Namespaces = false; xmlReader.WhitespaceHandling = WhitespaceHandling.None; landXML = (Hexagon.LandXML)serializer.Deserialize(xmlReader); } Console.WriteLine($"LinearUnit: {landXML.Units.LinearUnit}"); Console.ReadKey(); } 我没有得到我希望得到的答案。它运行没有错误但不打印“米”。 您缺少公制类。每个 XmlElement 都需要一个对应的类才能使序列化工作。 Units 有一个 Metric 元素。你错过了那个。 使用这些课程: [Serializable] [XmlRoot(ElementName = "LandXML")] public class LandXML { [XmlElement(ElementName = "Units")] public Units Units { get; set; } } public class Units { [XmlElement(ElementName = "Metric")] public Metric Metric { get; set; } } public class Metric { [XmlAttribute(AttributeName = "linearUnit" )] public string LinearUnit { get; set; } } 然后进行此更改: Console.WriteLine($"LinearUnit: {landXML.Units.Metric.LinearUnit}"); 会输出 线性单位:米 知道有在线工具可以帮助您从 Xml 生成数据传输对象,例如 https://xmltocsharp.azurewebsites.net/ 可以做到这一点,或者您最喜欢的 IDE 可能会提供一个扩展来做同样的事情。

回答 1 投票 0

定义和反序列化空类

我得到的是包含 "信封 "的XML数据。为了简洁起见,我把重点放在 "自定义字段 "上,它是一个 "字段 "的集合。这里是类定义中给我带来问题的部分:......

回答 1 投票 0

具有属性AND值的xml的反序列化

我对XML反序列化没有一点麻烦。我只能通过以下方式反序列化此xml:@JacksonXmlProperty(localName =“ field”)@JacksonXmlElementWrapper(useWrapping = false)List

回答 1 投票 1

“ XML文件中的“数据库”结构

因此,我必须在xml文档中定义一个“数据库”,该文档必须具有学校,年级,房间,课程和学生,然后我必须用C#编写一些类,该类必须获取并保存数据到...

回答 1 投票 0

加载XML的速度非常慢

我继承了一种使用简单文本文件保存文档的数据存储。文档具有一些属性(日期,标题和文本),并且这些属性编码为文件名: - 。txt,...

回答 2 投票 2

© www.soinside.com 2019 - 2024. All rights reserved.