将对象序列化和反序列化到XML文档中和从XML文档中反序列化。 XmlSerializer使您可以控制对象如何编码为XML。
添加<!DOCTYPE to serialized xml from symfony serializer
symfony 序列化器中有 xmlencoder,通过使用它我们可以实现这一点。 $data = ['foo' => 'Foo 值']; $encoder = new XmlEncoder(); $encoder->encode($data, 'xml'); // 编码如下...
我正在尝试使用 XmlSerializer 来序列化/反序列化 SyncML。我对 标签中出现的模式遇到困难,如下所示: 我正在尝试使用 XmlSerializer 来序列化/反序列化 SyncML。我对 <Get> 标签中出现的模式遇到困难,如下所示: <SyncML xmlns="SYNCML:SYNCML1.2"> <SyncHdr> <VerDTD>1.2</VerDTD> <VerProto>DM/1.2</VerProto> <!-- etc. --> </SyncHdr> <SyncBody> <Status> <CmdID>100</CmdID> <MsgRef>1</MsgRef> <CmdRef>0</CmdRef> <!-- etc. --> </Status> <Status> <CmdID>103</CmdID> <MsgRef>1</MsgRef> <CmdRef>4</CmdRef> <!-- etc. --> </Status> <Get> <CmdID>104</CmdID> <Item> <Target> <!-- etc. --> </Target> </Item> <Item> <Target> <!-- etc. --> </Target> </Item> </Get> <Get> <CmdID>105</CmdID> <Item> <Target> <!-- etc. --> </Target> </Item> <Item> <Target> <!-- etc. --> </Target> </Item> </Get> <Sequence> <CmdID>107</CmdID> <Replace> <CmdID>108</CmdID> <Item> <Target> <!-- etc. --> </Target> </Item> <Item> <Target> <!-- etc. --> </Target> </Item> </Replace> <Replace> <CmdID>109</CmdID> <Item> <Target> <!-- etc. --> </Target> </Item> </Replace> <Get> <CmdID>110</CmdID> <Item> <Target> <!-- etc. --> </Target> </Item> </Get> </Sequence> <Final/> </SyncBody> </SyncML> 到目前为止我的课程如下: [XmlRoot("SyncML", Namespace = "SYNCML:SYNCML1.2")] public class SyncML { [XmlElement] public SyncHdr SyncHdr { get; set; } [XmlArray("SyncBody")] [XmlArrayItem("Status", Type = typeof(StatusCommand))] [XmlArrayItem("Get", Type = typeof(GetCommand))] public SyncBody SyncBody { get; set; } } public class SyncHdr { [XmlElement("VerDTD")] public string VerDtd { get; set; } [XmlElement("VerProto")] public string VerProto { get; set; } // etc. } public class SyncBody : List<SyncCommand> { } public abstract class SyncCommand : List<Item> { [XmlElement("CmdID")] public int CmdId { get; set; } } public class StatusCommand : SyncCommand { [XmlElement("MsgRef")] public int MsgRef { get; set; } [XmlElement("CmdRef")] public int CmdRef { get; set; } // etc. } public class GetCommand : SyncCommand { public List<Item> Items { get; set; } } public class Item { [XmlElement("Target")] public Location Target { get; set; } } public class Location { [XmlElement("LocURI")] public string LocUri { get; set; } } 问题在于,在 XML 中,Get 标记包含一个属性元素 (CmdID)(与 Status 元素一样,但也包含任意数量的 Item 元素。有没有一种方法可以将我的 GetCommand 类属性化来处理我需要以不同的方式构建我的模型吗? 你的基本问题是,在两个地方,你继承自List<T>。 不推荐这样做(请参阅here进行讨论),此外序列化器也不能很好地支持,例如列表的属性永远不会被序列化。 相反,使用包含列表的类,并用 [XmlElement] 标记这些列表,以指示它们应该在没有外部包装元素的情况下进行序列化。 因此你的模型应该看起来像这样: [XmlRoot("SyncML", Namespace = "SYNCML:SYNCML1.2")] public class SyncML { [XmlElement] public SyncHdr SyncHdr { get; set; } [XmlArray("SyncBody")] [XmlArrayItem("Status", Type = typeof(StatusCommand))] [XmlArrayItem("Get", Type = typeof(GetCommand))] [XmlArrayItem("Final", Type = typeof(FinalCommand))] public List<SyncCommandBase> SyncBody { get; set; } = new (); } public class SyncHdr { [XmlElement("VerDTD")] public string VerDtd { get; set; } [XmlElement("VerProto")] public string VerProto { get; set; } // etc. } public abstract class SyncCommandBase { } public abstract class SyncCommand : SyncCommandBase { [XmlElement("CmdID")] public int CmdId { get; set; } } public class StatusCommand : SyncCommand { [XmlElement("MsgRef")] public int MsgRef { get; set; } [XmlElement("CmdRef")] public int CmdRef { get; set; } } public class GetCommand : SyncCommand { [XmlElement(ElementName="Item")] public List<Item> Item { get; set; } } public class Item { [XmlElement("Target")] public Location Target { get; set; } } public class Location { [XmlElement("LocURI")] public string LocUri { get; set; } } public class FinalCommand : SyncCommandBase { } 演示小提琴#1 这里。 请注意,我将 SyncCommandBase 作为 SyncCommand 的抽象超类插入,并让 FinalCommand 继承自它,因为 <Final/> 元素没有 <CmdID> 子元素。 如果您不想将 <Final/> 元素绑定到 SyncCommand 列表中,您可以按如下方式修改模型,使其成为中间 SyncBody 类中的显式属性: [XmlRoot("SyncML", Namespace = "SYNCML:SYNCML1.2")] public class SyncML { [XmlElement] public SyncHdr SyncHdr { get; set; } // Unchanged [XmlElement("SyncBody")] public SyncBody SyncBody { get; set; } = new (); } public class SyncBody { [XmlElement("Status", Type = typeof(StatusCommand), Order = 1)] [XmlElement("Get", Type = typeof(GetCommand), Order = 1)] public List<SyncCommand> SyncCommands { get; set; } = new (); [XmlElement("Final", Order = 100)] // Force <Final> to come last when re-serializing public SyncFinal Final { get; set; } } public abstract class SyncCommand { [XmlElement("CmdID")] public int CmdId { get; set; } } public class StatusCommand : SyncCommand { [XmlElement("MsgRef")] public int MsgRef { get; set; } [XmlElement("CmdRef")] public int CmdRef { get; set; } } public class GetCommand : SyncCommand { [XmlElement(ElementName="Item")] public List<Item> Item { get; set; } } public class Item { [XmlElement("Target")] public Location Target { get; set; } } public class Location { [XmlElement("LocURI")] public string LocUri { get; set; } } public class SyncFinal { } 演示小提琴 #2 这里。 @Zenilogix 我正在使用支持 SyncML 的手机,该手机支持使用 OBEX 串行(USB)与 Outlook 进行联系人同步。但我想从中获取联系人而不将其同步到 Outlook,否则我需要在同步到 Outlook 之前获取该联系人。我该怎么办请帮忙。 该手机有自己的工具可以将联系人与 Outlook 同步,所以我使用wireshak 捕获了它的数据包,然后我得到了 02 00 2d cb 00 00 00 00 42 00 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 73 79 6e 63 6d 6c 2b 77 62 78 6d 6c 00 c3 00 00 00 cd 请参阅 pcapmg1。 当我尝试使用我的代码发送相同的数据包时 我没有收到 90 00 03 电话的预期响应。请参阅 pcapmg2 我正在附加 pacap 文件,用于为手机本身提供的工具捕获的数据包。 我成功地使用串行连接到设备 LPCWSTR szPort2 = L"\\\\?\\usb#vid_1f58&pid_1f20&mi_03#dummy_03#{86e0d1e0-8089-11d0-9ce4-08003e301f73}"; HANDLE hSerial = CreateFile(szPort2, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //FILE_ATTRIBUTE_NORMAL,FILE_FLAG_OVERLAPPED 我也成功发送了obex的AT命令 // 发送AT+ISAT_OBEX=1指令 const char* command = "AT+ISAT_OBEX=1"; DWORD bytesWritten; if (!WriteFile(hSerial, command, strlen(command), &bytesWritten, NULL)) { std::cerr << "Error writing to serial port\n"; return;} after this i sent packets by reffering this pdf [OBEX Connect Example][1] page 23 ( ) OBEX Connect Example 我也在 OBEX Connect 中取得了成功。但我不知道如何继续前进 用于 obex 的 pcapmg1 与 wbxml 一起放置, pcapmg2 这是设备的预期响应,但我没有得到 这是我发送的第一个数据包 0x80, 0x00, 0x15, 0x10, 0x00, 0x04, 0x00, 0x46, 0x00, 0x0e, 0x53, 0x59, 0x4e, 0x43, 0x4d, 0x4c, 0x2d, 0x53, 0x59, 0x4e, 0x43,0x00,0x00,0x00 我得到了成功的回复 a0 00 1a 10 00 10 00 cb 00 00 00 00 4a 00 0e 53 59 4e 43 4d 4c 2d 53 59 4e 43 但是我正在发送第二个数据包 0x02,0x00,0x2d,0xcb,0x00,0x00,0x00,0x00,0x42,0x00,0x20,0x61, 0x70,0x70,0x6c,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x2f, 0x76,0x6e,0x64,0x2e,0x73,0x79,0x6e,0x63,0x6d,0x6c,0x2b, 0x77,0x62,0x78,0x6d,0x6c,0x00,0xc3,0x00,0x00,0x00,0xcd ,我没有从设备得到任何响应
我需要在 XML 中序列化一个包含使用不同具体类实现的 List<> 的类。 我需要一个没有 xmlns 引用的 XML。 这是我的例子: [可序列化] 公开课...
为什么反序列化子类时会引发 XmlSerializer.UnknownAttribute/UnknownNode 事件?
当使用子类时,我在反序列化由 XmlSerializer 生成的 XML 代码时遇到了问题。 UnknownAttribute 和 UnknownNode 事件触发,我认为存在错误
是否可以将 C# 模型转换为 xml 并将其上传到 FTP 服务器而无需本地临时文件?
我打算使用 xmlserializer 和 FluntFTP 库来做到这一点,但我懒得创建任何本地临时 xml 文件。
有没有一种好方法来处理在 C# 中可以具有带有变量名称的嵌套节点的文件的 XML 反序列化?
我正在用 C# 开发一个用于 XML 文件类型的反序列化器,该程序的程序我无法控制。不幸的是,XML 文件结构在两个主要方面完全打破了约定,到目前为止......
使用 XDocument 创建 XML,或使用 xsd.exe 和 XmlSerializer 从 XSD 架构创建 XML?
当您可以使用 XDocument 时,为什么要使用 xsd.exe 工具为 XSD 模式创建类,然后使用序列化器创建 XML 文件。 我是否应该始终使用 XDocument 并通过
WCF MessageContract 未绑定到类 - MessageContract 在端点中为 Null
我正在尝试在 WCF 中接收请求。 我需要用 MessageContract 进行响应,因此我需要将 MessageContract 作为输入。 我无法更改输入 SOAP 请求,并且必须将其接受为...
我想将许多 xml 反序列化为 C# 对象,但 xml 的同一元素具有不同的名称。 私有 FileAsXML GetDataObject(字符串 xml) { FileAsXML 数据 = new FileAsXML();
这是我的 C# 反序列化代码: 私人无效button1_Click(对象发送者,EventArgs e) { LandXML myObject; XmlSerializer mySerializer = 新的 XmlSerializer(典型...
java.lang.Long 无法转换为 java.util.Map 但我不会转换任何 long
私有静态Serializer序列化器; 私有静态 Map 用户 = new HashMap<>(); // 私有静态 Map admins = new HashMap<>(); 私人静态地图...
我正在尝试对我的 XML 文件使用 XmlSerializer.Deserialize() 。这是代码: 私有无效LoadSceneDialogues() { if (dialogXML != null) { 场景对话 = 新词典 我正在尝试对我的 XML 文件使用 XmlSerializer.Deserialize()。这是代码: private void LoadSceneDialogues() { if (dialogueXML != null) { sceneDialogues = new Dictionary<int, Dialogue>(); XmlSerializer serializer = new XmlSerializer(typeof(List<Dialogue>), new XmlRootAttribute("Dialogues")); using (var reader = new StringReader(dialogueXML.text)) { try { Debug.Log("Purely for Debugging1"); var loadedData = (List<Dialogue>)serializer.Deserialize(reader); foreach (var data in loadedData) { Debug.Log($"oID: {data.oID} name: {data.characterName}"); foreach (var sentence in data.sentences) { Debug.Log($"sentence: {sentence}"); } Debug.Log($"sentences count: {data.sentences.Length}"); //Debug.Log($"sentences: {data.sentences}"); sceneDialogues.Add(data.oID, data); } if (sceneDialogues != null) { Debug.Log("Purely for Debugging2"); } } catch (InvalidOperationException ex) { Debug.LogError($"Error deserializing XML: {ex.Message}"); Debug.Log($"Loaded XML data:\n{dialogueXML.text}"); } } } else { Debug.LogError("Dialogue XML file not assigned in DialogueManager!"); } } 这是对话课: using UnityEngine; [CreateAssetMenu(fileName = "NewDialogue", menuName = "Dialogue")] public class Dialogue : ScriptableObject { public string characterName; // 캐릭터 이름 [TextArea(3, 20)] public string[] sentences; // 대화 내용 public int oID = -1; public int nextoID = -1; public int animID = -1; } 这是我正在使用的 XML 的一部分: <?xml version="1.0" encoding="UTF-8"?> <Dialogues> <Dialogue> <oID>0</oID> <nextoID>-1</nextoID> <animID>0</animID> <characterName>a</characterName> <sentences> <sentence>god...</sentence> <sentence>wtf?</sentence> </sentences> </Dialogue> </Dialogues> 除了句子之外,其他工作正常。 我从这个对话对象得到的数组是空的,而其他像“oid”的数组是他们应该的。 我认为这是因为“句子”是嵌套的,但我不知道如何正确处理这个问题。 做了一些日志,发现dialog.sentences是空的,而其他的则不是。 我想修改当前代码,以便它正确处理句子。 将对话句子属性更新为元素名称为“sentence”的 XMLArrayItem: public class Dialogue : ScriptableObject { public string characterName; // 캐릭터 이름 [XmlArrayItem(ElementName="sentence")] public List<string> Sentences{ get; set; } public int oID = -1; public int nextoID = -1; public int animID = -1; }
ASP.NET Core中是否可以为单个控制器启用XmlSerialization
我有一个 Web API,它有多个控制器,其中一个由于遗留原因返回 XML,而其他所有控制器都返回 JSON。 在 .NET Framework 中,我可以有选择地启用 XML 序列化...
C# XmlSerializer - 输出控制新行的多个 xml 片段
我希望能够编写没有命名空间、没有 XML 前导码等的 xml 片段。 XmlSerializer.Serialize() 在序列化为通用输出流时会产生缩进输出,但它使用 &qu...
Symfony Serializer xml,按顺序包含复杂的 xsd 类型
我收到以下 XSD: 我收到以下 XSD: <xsd:complexType name="typeADDRESS"> <xsd:sequence> <xsd:element ref="NAME" minOccurs="0" maxOccurs="unbounded"/> <!-- # ... just to show that these aren't the only ones --> <xsd:sequence minOccurs="0" maxOccurs="unbounded"> <xsd:element ref="EMAIL"/> <xsd:element ref="PUBLIC_KEY" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <!-- # ... and also some attributes later --> </xsd:sequence> </xsd:complexType> 如果电子邮件元素的 XML 数据如下所示: <EMAIL>A</EMAIL> <PUBLIC_KEY>A1</PUBLIC_KEY> <PUBLIC_KEY>A2</PUBLIC_KEY> <EMAIL>B</EMAIL> <PUBLIC_KEY>B1</PUBLIC_KEY> <PUBLIC_KEY>B2</PUBLIC_KEY> 如何将其放入有意义的 PHP 结构中? 当正常化回来时,我如何保持订单? 我需要使用NormalizedInterface、DenormalizedInterface吗? 其他属性又如何,我是否也需要手动(去)规范化它们? 在大多数 API 中处理此类结构是很棘手的。我首先使用 XSLT 将数据转换为更规则的结构: <xsl:for-each-group select="*" group-starting-with="EMAIL"> <ENTRY email="{EMAIL}"> <xsl:copy-of select="PUBLIC_KEY"/> </ENTRY> </xsl:for-each-group> 这会将其变成: <ENTRY email="A"> <PUBLIC_KEY>A1</PUBLIC_KEY> <PUBLIC_KEY>A2</PUBLIC_KEY> </ENTRY> <ENTRY email="B"> <PUBLIC_KEY>B1</PUBLIC_KEY> <PUBLIC_KEY>B2</PUBLIC_KEY> </ENTRY> 作为一般原则,如果您的 XML 格式难以处理,最好在处理的第一阶段将其清理,以避免使实际应用程序的逻辑复杂化。
将 XmlSerializer 与 Azure ShareFileClient 结合使用会创建大小不正确的文件
我正在尝试使用 XmlSerializer 将 XML 文件写入 azure 文件共享,但我的文件始终与我设置的 MaxSize 一样大。 我有一个 Azure 函数,它调用以下函数来写入 imp...
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; } }
xxx 或者 xxx 或者 xxx xxx 如果两者都存在,我需要使用
我有一个由外部源提供的 xml。我对它们的设计或功能没有发言权。 我可以到达初始分支并根据需要读取值。我害怕编辑,因为我无法访问任何其他内容...