我的代码生成的命名空间有问题。我想要的是下面的 XML:
<?xml version="1.0" encoding="utf-8"?>
<ClassToSerialize Type="Customer" Name="Some Name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.123.org/namespace C:\Schema\ClassToSerialize.xsd"
xmlns:Test="http://www.Test.org/" xmlns="http://www.nrf-arts.org/namespace">
<Address>
<Line1>Addr1</Line1>
<Line2>Addr2</Line2>
</Address>
</ClassToSerialize>
我得到的是这个 XML:
<?xml version="1.0" encoding="utf-8"?>
<ClassToSerialize xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schemaLocation="http://www.123.org/namespace C:\Schema\ClassToSerialize.xsd"
xmlns:Test="http://www.Test.org/" xmlns:xmlns="http://www.nrf-arts.org/namespace" Type="Customer" Name="Some Name">
<Address>
<Line1>Addr1</Line1>
<Line2>Addr2</Line2>
</Address>
</ClassToSerialize>
主要区别是:
1. xmlns:schemaLocation= needs to be xsi:schemaLocation=
2. xmlns:xmlns= needs to be xmlns=
3. Attributes Order, I would prefer the Attributes to be presented before the namespace attributes (This is not a big Issue, just nice to have)
目前我正在做的是用我想要的值替换上面 1 和 2 中的序列化字符串中的值,这是一个可行的 hack,但我怀疑有一种方法可以修改 namespace 代码来在此时执行此操作?
这是我正在使用的代码,我如何更改 GetNameSpace() 以执行我在第 1 点和第 2 点中需要的操作,我还可以重新排序属性吗?:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ClassToSerialize myInstance = new ClassToSerialize();
myInstance.Type = "Customer";
myInstance.Name = "Some Name";
myInstance.AddressField = new Address("Addr1", "Addr2");
String sString = SerializeObject<ClassToSerialize>(myInstance, GetNameSpace());
//Hack to achieve what I want from namespaces
sString = sString.Replace("xmlns:schemaLocation=", "xsi:schemaLocation=");
sString = sString.Replace("xmlns:xmlns=", "xmlns=");
}
private XmlSerializerNamespaces GetNameSpace()
{
XmlSerializerNamespaces xsNS = new XmlSerializerNamespaces();
xsNS.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xsNS.Add("xmlns", "http://www.nrf-arts.org/namespace");
xsNS.Add("schemaLocation", "http://www.123.org/namespace C:\\Schema\\ClassToSerialize.xsd");
xsNS.Add("Test", "http://www.Test.org/");
return xsNS;
}
public static string SerializeObject<X>(X toSerialize, XmlSerializerNamespaces xmlNameSpace)
{
string strRetVal = "";
try
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
StringWriter textWriter = new StringWriter();
using (StringWriter writer = new Utf8StringWriter())
{
xmlSerializer.Serialize(writer, toSerialize, xmlNameSpace);
strRetVal = writer.ToString();
}
}
catch (Exception ex)
{
string strError = ex.ToString();
}
return strRetVal;
}
}
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
}
}
public class ClassToSerialize
{
[XmlAttribute()]
public string Type { get; set; }
[XmlAttribute()]
public string Name { get; set; }
[XmlElement("Address")]
public Address AddressField { get; set; }
}
public class Address
{
[XmlElement, DefaultValue("")]
public string Line1 { get; set; }
[XmlElement, DefaultValue("")]
public string Line2 { get; set; }
public Address()
{
}
public Address(string L1, string L2)
{
Line1 = L1;
Line2 = L2;
}
}
最佳答案
您可以按照 How to add xsi schemalocation to root c # object XmlSerializer 中的答案添加合成属性来添加 xsi:schemaLocation -- 但使用属性而不是字段。如果您使用一个字段,您实际上会增加您的类在内存中的占用空间。
要定义默认命名空间 xmlns="http://www.nrf-arts.org/namespace",您可以申请 [XmlRoot("ClassToSerialize", Namespace="http://www.nrf-arts.org/namespace")]到您的 ClassToSerialize 或 allocate an XmlRootAttribute override and pass it to the XmlSerializer constructor .如果您执行后者,请务必缓存序列化程序。
除了实现 IXmlSerializable ,有点繁琐,不知道能不能用XmlSerializer来控制属性顺序。但是,XML 规范指出 "the order of attribute specifications in a start-tag or empty-element tag is not significant" ,所以我建议不要担心。
因此下面应该可以解决问题。请注意,我将您的 GetNameSpace() 移到了 ClassToSerialize 中并将其重命名为 GetAdditionalNamespaces():
[XmlRoot("ClassToSerialize", Namespace="http://www.nrf-arts.org/namespace")]
public class ClassToSerialize
{
public static XmlSerializerNamespaces GetAdditionalNamespaces()
{
XmlSerializerNamespaces xsNS = new XmlSerializerNamespaces();
xsNS.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xsNS.Add("Test", "http://www.Test.org/");
return xsNS;
}
[XmlAttribute("schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public string XSDSchemaLocation
{
get
{
return "http://www.123.org/namespace C:\\Schema\\ClassToSerialize.xsd";
}
set
{
// Do nothing - fake property.
}
}
[XmlAttribute()]
public string Type { get; set; }
[XmlAttribute()]
public string Name { get; set; }
[XmlElement("Address")]
public Address AddressField { get; set; }
}
关于c# - XML 序列化命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27530334/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
假设我必须(小型到中型)阵列:tokens=["aaa","ccc","xxx","bbb","ccc","yyy","zzz"]template=["aaa","bbb","ccc"]如何确定tokens是否以相同的顺序包含template的所有条目?(请注意,在上面的示例中,应忽略第一个“ccc”,从而由于最后一个“ccc”而导致匹配。) 最佳答案 这适用于您的示例数据。tokens=["aaa","ccc","xxx","bbb","ccc","yyy","zzz"]template=["aaa","bbb","ccc"]po