标签: xmlserializer

在具有命名空间前缀的元素内创建不具有命名空间前缀的 XML 元素

使用 XmlSerializer 类,我想实现以下结果 XML:

<n:root xmlns:n="http://foo.bar">
    <child/>
</n:root>
Run Code Online (Sandbox Code Playgroud)

请注意,根已定义命名空间和前缀,但子级没有。我设法使用以下 XSLT 来做到这一点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">

        <xsl:element name="n:root" xmlns:n="http://foo.bar">
            <xsl:element name="child" />
        </xsl:element >

    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

...但是我想在类上使用 .NET XmlSerializer 和 System.Xml.Serialization 属性。我创建了以下两个类:

[XmlRoot(ElementName = "root", ElementNamespace = "http://foo.bar")]
public class Root
{
    [XmlElement(ElementName = "child")]
    public Child Child { get; set; }
}

public class Child {}
Run Code Online (Sandbox Code Playgroud)

然后我尝试将命名空间添加到 XmlSerializer 并使用 XmlSerializerNamespaces 类对其进行序列化:

public string Foo()
{
    var root = new Root { Child = new Child() };

    var ns = …
Run Code Online (Sandbox Code Playgroud)

.net c# xml xml-namespaces xmlserializer

3
推荐指数
1
解决办法
3080
查看次数

适用于 Python 3 的更好的 XML 序列化器

我尝试了 xml_marshaller 如下:

from xml_marshaller import xml_marshaller

class Person:
    firstName = "John"
    lastName = "Doe"

person1 = Person()
strXmlPerson = xml_marshaller.dumps(person1);
print(strXmlPerson)
Run Code Online (Sandbox Code Playgroud)

上面的输出是:

b'<marshal><object id="i2" module="__main__" class="Person"><tuple/><dictionary id="i3"><string>firstName</string><string>John</string><string>lastName</string><string>Doe</string></dictionary></object></marshal>'
Run Code Online (Sandbox Code Playgroud)

格式化后看起来像这样,在我看来这是最丑陋的 XML:

b'<marshal>
    <object id="i2" module="__main__" class="Person">
        <tuple/>
        <dictionary id="i3">
            <string>firstName</string>
            <string>John</string>
            <string>lastName</string>
            <string>Doe</string>
        </dictionary>
    </object>
</marshal>'
Run Code Online (Sandbox Code Playgroud)

b 和引号在那里做什么?也许意味着“二进制”?这真的是数据的一部分,还是只是将其打印到控制台的副作用?

是否有任何 Python 3 库可以创建更接近“人类”的东西,如下所示:

<Person> 
   <firstname>John</firstname>
   <lastname>Doe<lastname>
</Person> 
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似于 .NET 创建的内容(请参阅http://mylifeismymessage.net/xml-serializerdeserializer/

请不要告诉我尝试 JSON 或 YAML,这不是问题。例如,我可能想通过 XSLT 运行该文件。

2天后更新:

我喜欢 Peter Hoffman 的回答: How can I conversion XML into a Python object? …

xml xmlserializer python-3.x

3
推荐指数
1
解决办法
8575
查看次数

XmlSerializer用0x0020(十六进制值)替换空格

出于某种原因,我的带有空格的XmlElements用_x0020代替空格打印.

例如,

[XmlElement("The Total")]
public double total { get; set; }
Run Code Online (Sandbox Code Playgroud)

<The_0x0020_Total>当我把它打印出来时变成了 我正在使用TextWriter输出,然后我使用XmlSerializer.Serialize打印到文件,但它不起作用.

c# hex xmlserializer

2
推荐指数
1
解决办法
401
查看次数

XmlSerializer是否会创建空文档

好的,下面的代码我已经生产了一年多没有变化.它一直运作良好.在过去一个月内,少数机器报告xml文档完全为空.它们甚至不包含xml标头.我无法复制突然变空的文件,也无法建议一种方法.我希望有人有类似的问题,他们解决了.

大多数使用此代码的机器已经使用了大约一年,如果不是更多的话.用于在其中包含数据和列表的空文件.文件不会同时序列化.在程序退出之前,一个接一个地保存/序列化.

我的问题:下面的代码是否有可能创建一个空文件?还有什么会导致他们突然变空?有没有其他人在过去一个月中遇到过XML-serializer的问题?(这个问题仅发生在过去一个月中已稳定3个月以上的版本.)

如果您有疑问或我遗失了什么请问.还有各种各样的类型,我序列化...所以如果你可以想象它我可能有一些类似的序列化.

 public class BackEnd<T> {
 public string FileSaveLocation = "this gets set on startup";
 public bool DisabledSerial;
 public virtual void BeforeDeserialize() { }
 public virtual void BeforeSerialize() { }
 public virtual void OnSuccessfulSerialize() { }
 protected virtual void OnSuccessfulDeserialize(ListBackEnd<T> tmpList) { }
 protected virtual void OnDeserialize(ListBackEnd<T> tmpList) { }

 public virtual void serialize()
    {
        if (DisabledSerial)
            return;
        try
        {
            BeforeSerialize();

            using (TextWriter textWrite = new StreamWriter(FileSaveLocation))
            {
                (new XmlSerializer(this.GetType())).Serialize(textWrite, this);
                Debug.WriteLine(" [S]");
                textWrite.Close();
            }
            OnSuccessfulSerialize();
        }
        catch …
Run Code Online (Sandbox Code Playgroud)

c# xmlserializer

2
推荐指数
1
解决办法
1655
查看次数

使用.NET XmlSerializer类时,有没有其他人在MonoTouch中经历过慢反序列化?

我有一个MonoTouch iOS应用程序,我正在从Web服务反序列化大量人员.XML非常简单:根节点是人员列表,每个人只有5个属性.名单相当大......大约1000人.

当我在iPhone模拟器中运行反序列化时,操作只需要大约一秒钟.当我在iPhone 3GS上运行时,操作大约需要13秒.当然,sim运行x86代码,应用程序运行ARM代码.此外,手机中的可用马力比SIM卡要少.但它真的会有很大的不同吗?

有没有其他人使用MonoTouch进行慢速.NET序列化?有谁知道原因?如果是这样,你有没有办法处理它?也许线程化或者可能是不同的序列化库?

.net serialization xamarin.ios xmlserializer ios

2
推荐指数
1
解决办法
472
查看次数

为什么我仍然可以在没有属性[System.SerializableAttribute()]的情况下序列化类?

我正在玩序列化(特别是XmlSerializer),我有点困惑.

我打算序列化的类具有以下属性:

[System.SerializableAttribute()]
Run Code Online (Sandbox Code Playgroud)

这很好,但是当我从类派生时,我仍然可以序列化派生类?这很奇怪,因为我认为属性没有继承到派生类?

其次,为了加剧我的困惑,我创建了一个没有从任何东西继承的标准类,也没有用任何属性标记它,我仍然可以序列化它?

c# xmlserializer

2
推荐指数
1
解决办法
271
查看次数

InvalidOperationException错误反映类

读取多次与此错误相关的帖子并没有找到我的问题的解决方案后,我在这里解释.

我使用XmlSerializer来序列化简单类.

这是我的代码:

    private void btnGenerateXml_Click(object sender, RoutedEventArgs e)
    {
        Orchard orchard = new Orchard
        {
            Recipe = new Recipe
            {
                Name = "Generated by JooWeb.Tools",
                Author = "admin",
                ExportUtc = DateTime.UtcNow
            },
            MyDatas = new MyDatas
            {
                //Test = "test"
                TrendDatas = new TrendDatas
                {
                    Id = null,
                    Status = "Published",
                    TrendDatasPart = new TrendDatasPart
                    {
                        IdSource = 0,
                        PostalCode = "1000",
                        Locality = "Test5",
                        Surface = (decimal)0.00,
                        Price = (decimal)0.00,
                        Type = "",
                        InsertDateIndicator = "",
                        UpdateDateIndicator = …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-serialization invalidoperationexception xmlserializer

2
推荐指数
1
解决办法
4355
查看次数

防止XmlSerializer在Deserialize上自动实例化List's

假设我有这个示例类:

public class MyClass
{
    public List<int> ListTest { get; set; }
    public string StringTest { get; set; }
    public int IntTest { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这段代码:

string xmlStr = "<MyClass><StringTest>String</StringTest></MyClass>";
XElement xml = XElement.Parse(xmlStr);
XmlSerializer ser = new XmlSerializer(typeof(MyClass));
using (XmlReader reader = xml.CreateReader())
{
    var res = ser.Deserialize(reader);
}
Run Code Online (Sandbox Code Playgroud)

完成反序列化后,其值为res:
ListTest- >清空列表,其中Count = 0(非空).
StringTest- >"String"按预期
IntTest- > 0表示期望(整数的默认值).

我想串行行事一样(default(List<T>)是空与李斯特的),而不是实例化它们.

我怎么能做到这样的事情?
顺便说一句,我必须使用XmlSerializer.

c# xmlserializer deserialization

2
推荐指数
1
解决办法
589
查看次数

反序列化派生类型时,XMLSerializer警告有关未知的节点/属性

我最近使用XMLSerializer注册了未知节点,元素和属性的事件处理程序,该处理程序用于反序列化类型层次结构中的复杂类型。我这样做是因为我收到的某些XML来自第三方。我对可能会造成麻烦的数据格式更改感兴趣。

在XML中,XMLSerializer生成它使用标准XML属性xsi:type="somederivedtypename"来标识由XML元素表示的实际派生类型。

令我惊讶的是,同一序列化器将反序列化时刚产生的相同属性视为未知。但是,有趣的是,反序列化是正确且完整的(在我的实际程序中还具有更复杂的类型和数据)。这意味着序列化程序在反序列化的早期阶段会正确评估类型信息。但是在随后的数据提取阶段,该属性显然被误认为对象的真实数据部分,这当然是未知的。

在我的应用程序中,无用的警告最终使不需要的通用日志文件混乱。在我看来,序列化程序应该不打扰地读回它生成的XML。我的问题:

  • 难道我做错了什么?
  • 有解决方法吗?

一个最小的例子在这里:

using System;
using System.IO;
using System.Xml.Serialization;

namespace XsiTypeAnomaly
{
    /// <summary>
    /// A trivial base type.
    /// </summary>
    [XmlInclude(typeof(DerivedT))]
    public class BaseT{}

    /// <summary>
    /// A trivial derived type to demonstrate a serialization issue.
    /// </summary>
    public class DerivedT : BaseT
    {
        public int anInt { get; set; }
    }

    class Program
    {
        private static void serializer_UnknownAttribute
            (   object sender, 
                XmlAttributeEventArgs e )
        {
            Console.Error.WriteLine("Warning: Deserializing " 
                    + e.ObjectBeingDeserialized
                    + ": …
Run Code Online (Sandbox Code Playgroud)

c# xml xsi xmlserializer xsitype

2
推荐指数
1
解决办法
1128
查看次数

C#System.Xml.Serialization-仅使用&lt;a&gt; &lt;/a&gt;而从不使用&lt;a/&gt;

我的客户遇到一个奇怪的问题-我正在读取XML文档(实际上是InfoPath文档)XmlSerializer,进行修改,然后使用编写XML文档XmlSerializer,然后使用来添加一些处理指令XmlTextWriter。一切运行良好,并且生成的文档实际上完全符合XML,并且可以由InfoPath读取。但是,结构发生的变化是原始文档中所有空标签都以表格形式写入<A></A>,而在编写文档时,该文档变为<A/>。由于XML标准,实际上完全相同。但是,我的客户(一家大公司)显然具有一些带有hardcoded的检查/验证脚本<A></A>,但是它们失败了。他现在很沮丧,并且懒得更改脚本,并且想要这种<A></A>符号!我该如何设定XmlTextWriter 去做吧?

c# xml xml-serialization xmltextwriter xmlserializer

2
推荐指数
1
解决办法
42
查看次数