- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试读入这段 xml 代码,并且大部分内容都是正确的。我遇到的问题是围绕“元素”元素和具有类型属性的命名空间。
我正在尝试读取的 XML 文件 (text.xml):
<?xml version="1.0" encoding="UTF-8"?>
<archimate:model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:archimate="http://www.archimatetool.com/archimate" name="ACME"
id="38f940a6-9fc7-4619-9806-fd4d48397af7" version="4.0.0">
<folder name="Strategy" id="ffc905fd-a78c-4311-b2f6-a188c00ed10a" type="strategy"/>
<folder name="Business" id="0d806081-438f-4ae5-86d9-8ff5ee4e9f1a" type="business"/>
<folder name="Application" id="3566e95c-c070-46bb-bde3-f6017ae49dc1" type="application"/>
<folder name="Technology & Physical" id="4fabc4fa-a882-4843-ae69-170b66df7685" type="technology"/>
<folder name="Motivation" id="ce5e0874-1c06-41c1-9b95-eec6558afa89" type="motivation">
<element xsi:type="archimate:Principle" name="Secure the Whole" id="9546e727-f9f7-402a-a4a2-50519d697d75"/>
</folder>
</archimate:model>
为 XML 输入和输出标记我的模型的代码:
using System;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.Collections.Generic;
namespace archimate_reporter.Models
{
public class Folder
{
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "type")]
public string Type { get; set; }
[XmlElement(ElementName = "element")]
public List<Element> Element { get; set; }
}
[XmlRoot(ElementName="element")]
public class Element
{
[XmlAttribute(AttributeName = "type", Form=XmlSchemaForm.Qualified, Namespace="http://www.archimatetool.com/archimate")]
public string Type { get; set; }
}
[XmlRoot(ElementName = "model", Namespace = "http://www.archimatetool.com/archimate")]
public class Model
{
[XmlElement(ElementName = "folder", Namespace = "")]
public List<Folder> Folder { get; set; }
[XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
public string Xsi { get; set; }
[XmlAttribute(AttributeName = "archimate", Namespace = "http://www.w3.org/2000/xmlns/")]
public string Archimate { get; set; }
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "version")]
public string Version { get; set; }
}
}
调用程序进行测试:
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using archimate_reporter.Models;
namespace archimate_reporter
{
class Program
{
static void Main(string[] args)
{
Program t = new Program();
t.DeserializeObject("resource//test.xml");
}
private void DeserializeObject(string filename)
{
XmlSerializer serializer = new
XmlSerializer(typeof(Model));
FileStream fs = new FileStream(filename, FileMode.Open);
XmlReader reader = XmlReader.Create(fs);
Model i;
i = (Model)serializer.Deserialize(reader);
fs.Close();
}
}
}
程序抛出堆栈错误:
Unhandled Exception: System.InvalidOperationException: There is an error in XML document (11, 6). ---> System.InvalidOperationException: The specified type was not recognized: name='Principle', namespace='http://www.archimatetool.com/archimate', at <element xmlns=''>.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderModel.Read2_Element(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderModel.Read3_Folder(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderModel.Read4_Model(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderModel.Read5_model()
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
at archimate_reporter.Program.DeserializeObject(String filename) in D:\mmcke\workspace\archimate-reporter\Program.cs:line 36
at archimate_reporter.Program.Main(String[] args) in D:\mmcke\workspace\archimate-reporter\Program.cs:line 16
最佳答案
你需要改变你的模型来提供一些东西来反序列化 archimate:Principle
类型。此外,您需要更正 Element
上 Type 属性的命名空间。
根据您的 XML,我假设 Element
是一个基类,并且 type
属性指示要使用的父类(super class)型,我已将其放入新类中称为原则
。如果你不想要一个单独的类,你可以只使用 Element
,但是你需要给它 XmlType
属性来告诉 Serializer
在看到 xsi:type="archimate:Principle"
时使用它。
[XmlType("Principle", Namespace = "http://www.archimatetool.com/archimate")]
public class Principle : Element
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("id")]
public string Id { get; set; }
}
[XmlRoot(ElementName = "element", Namespace = "http://www.archimatetool.com/archimate")]
[XmlInclude(typeof(Principle))]
public class Element
{
[XmlAttribute(AttributeName = "type", Form = XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public string Type { get; set; }
}
关于在元素名称和属性中使用多个命名空间的 C# XML 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406387/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!