我想使用的 API 需要我在嵌套元素上设置 xmlns 属性,如下所示:
<root>
<mainelement>
</mainelement>
<mainelement>
<subelement xmlns="http://example.com/xml" otherAttr="value">
</subelement>
</mainelement>
</root>
子元素的类定义如下:
public class subelement
{
[XmlAttribute]
public string otherAttr { get; set; }
[XmlAttribute]
public string xmlns { get; set; } = "http://example.com/xml";
}
但是,当我尝试使用 XmlSerializer 序列化根对象时,xmlns 属性总是丢失。否则它工作正常。当我重命名它创建的这个属性时,我猜它与作为保留关键字的 xmlns 有关。
此外,我无法使用将命名空间设置为 Serialize 方法的第三个参数的标准方法,因为我只希望此属性位于 subelement 对象上。
有没有办法在序列化后无需手动编辑文件的情况下完成此操作?
最佳答案
您需要在 mainelement 的 subelement 属性上指定正确的命名空间。
public class mainelement
{
[XmlElement(Namespace = "http://example.com/xml")]
public subelement subelement { get; set; }
}
public class subelement
{
[XmlAttribute]
public string otherAttr { get; set; }
}
参见 this fiddle用于工作演示。
关于C# XmlSerializer : Create xmlns attribute on a nested object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42019927/
我正在使用以下调用来获取我的部分DOM的XML代码。varsXML=newXMLSerializer().serializeToString(document.getElementsByTagName("TopElementTag")[0]);但是,当我显示这个字符串时,它都是一行。有没有一种方法可以格式化此字符串,使其具有换行符和制表符以使其易于人类阅读? 最佳答案 我用了vkBeutify使用以下代码。varsXML=newXMLSerializer().serializeToString(document.getElement
我最近使用XMLSerializer为未知节点、元素和属性注册了事件处理程序,用于从类型层次结构中反序列化复杂类型。我这样做是因为我收到的一些XML来自第三方;我对数据格式更改感兴趣,这可能会给我带来麻烦。在XMLSerializer生成的XML中,它使用标准XML属性xsi:type="somederivedtypename"来标识XML元素表示的实际派生类型。我很惊讶地看到同一个序列化程序在反序列化时将它刚刚生成的相同属性视为未知。有趣的是,反序列化是正确和完整的(在我的真实程序中也有更复杂的类型和数据)。这意味着序列化程序会在反序列化的早期阶段正确评估类型信息。但是在稍后的数据提
我有以下示例代码,它为x86和x64生成不同的输出。classSampleSerializer{publicstaticstringSerialize(string[]samples){varxmlDocument=string.Empty;varxmlSerializer=newXmlSerializer(typeof(string[]));using(varms=newMemoryStream()){xmlSerializer.Serialize(ms,samples);xmlDocument=Encoding.UTF8.GetString(ms.ToArray());}retur
我在Linux作业的Oraclesqlplus查询中使用XMLSerializer。在SQLDeveloper命令选项卡上,一切看起来都很好,但在linux上,我看到xml输出尾随空格:${ORAPLUS}-s/@tns_entry输出:HowdoIgetridofthespaceshere?value当然,我可以运行post-pretty-up命令来删除尾随空格,但这看起来像是在对抗症状。 最佳答案 这并不是真正的XMLSerialize()调用,它是假脱机数据的默认行为。在你的脚本中,添加:SETTRIMSPOOLONFromt
使用DataContracts,您可以从IExtensibleDataObject派生以允许往返工作,而不会丢失XML文件中的任何未知附加数据。我不能使用DataContract,因为我需要控制输出XML的格式。但我还需要能够在旧版本应用程序中读取future版本的XML文件,而不会丢失XML文件中的任何数据。例如XMLv1:FredXMLv2:Fred42如果从我的应用程序的v1中读取一个XMLv2文件,反序列化和再次序列化它会将它变成一个XMLv1文件。即“年龄”字段被删除。有什么类似于IExtensibleDataObject的东西可以与XmlSerializer一起使用来避免A
使用XmlSerializer序列化C#类时,表示类属性的属性/元素将与源代码中的名称相同。我知道你可以通过这样做来覆盖它:[XmlAttribute("num")]publicintNumberOfThingsThatAbcXyz{get;set;}我希望为我的类生成的XML尽可能紧凑,但显然仍然能够在另一端自动反序列化。有没有办法尽可能地缩小这些名称,而不必手动考虑并用短字符串注释所有内容?生成的XML易于人类阅读不是问题。 最佳答案 Hmya,注意像这样的微优化。用现代计算硬件让他们获得返回是非常困难的。涉及处理XML的I/O
我的问题最好用一个简单的例子来描述。考虑这样的2个类:classOrder{[XmlAttribute]intorderId;[XmlAttribute]intcustomerId;Listitems;}classOrderItem{[XmlAttribute]intpartCode;[XmlAttribute]intquantity;}使用XmlSerializer,这将序列化为如下内容:我想做的是删除级别,以便元素直接位于相应的下方有什么办法吗? 最佳答案 使用XmlElement属性:classOrder{[XmlAttrib
我正在尝试使用XMLSerializer将文本写入XML文件。text(String)函数自动转义字符。是否可以在将文本添加到xml文件时不转义文本?如果不可能,您能否推荐一个简单的解决方法,而无需重写我所有的XML创建代码?谢谢 最佳答案 在此期间,您可能继续前进并找到了自己的解决方案,但这里有一个可能的解决方案。我没有使用序列化器,而是直接调用底层的StringWriter来插入原始文本(在我的例子中是格式正确的xml,所以我想避免转义标记)。请注意,序列化程序刷新对于获得正确的顺序非常重要。XmlSerializerseria
我正在将C#应用程序移植到Java,但不知道它在做什么。我应该用什么替换.Net的Java中的XmlSerializer?谢谢。 最佳答案 JAXB是您最好的选择,它也是Java标准。有趣的帖子:(由BlaiseDoughan提供)HowdoesJAXBcomparetoXStreamHowdoesJAXBcomparetoSimple 关于java-.NET的XmlSerializer的Java替代品是什么,我们在StackOverflow上找到一个类似的问题:
我正在尝试序列化对象以导入到另一个软件,问题是,要导入的XML中的元素包含“:”(例如:)。我用[XmlAttribute("ftr:filter")]声明了覆盖这些名称的类和[XMLElement(ftr:differentFilter")],但序列化器产品不同的节点。我打赌它与编码有关,但我无法更改结果(以为我更改了编码)。类示例:publicclassListPrijemkaRequest{[XmlAttribute("version")]publicstringVersion{get;set;}[XmlAttribute("prijemkaVersion")]publicstr