标签: xml-serialization

将Python字典序列化为XML

有一个名为"simplejson"的简单JSON序列化模块,它可以轻松地将Python对象序列化为JSON.

我正在寻找可以序列化为XML的类似模块.

python xml serialization xml-serialization

62
推荐指数
4
解决办法
7万
查看次数

决定何时使用XmlDocument vs XmlReader

我正在优化自定义对象 - > XML序列化实用程序,它已完成并正常工作,这不是问题.

它通过将文件加载到XmlDocument对象中,然后递归遍历所有子节点来工作.

我认为也许使用XmlReader而不是XmlDocument加载/解析整个事情会更快,所以我也实现了那个版本.

算法完全相同,我使用包装类来抽象处理一个XmlNode与一个的功能XmlReader.例如,GetChildren方法yield返回子项XmlNode或SubTree XmlReader.

所以我写了一个测试驱动程序来测试这两个版本,并使用一个非平凡的数据集(一个900kb的XML文件,大约有1,350个元素).

但是,使用JetBrains dotTRACE,我发现XmlReader版本实际上比XmlDocument版本慢!XmlReader当我在迭代子节点时,似乎在读取调用中涉及一些重要的处理.

所以我要说这一切:

有什么优势/劣势XmlDocumentXmlReader,和你应该使用什么情况下要么?

我的猜测是,文件大小阈值XmlReader在性能上变得更经济,而且内存密集度更低.但是,该阈值似乎超过1MB.

ReadSubTree每次都在调用处理子节点:

public override IEnumerable<IXmlSourceProvider> GetChildren ()
{
    XmlReader xr = myXmlSource.ReadSubtree ();
    // skip past the current element
    xr.Read ();

    while (xr.Read ())
    {
        if (xr.NodeType != XmlNodeType.Element) continue;
        yield return new XmlReaderXmlSourceProvider (xr);
    }
}
Run Code Online (Sandbox Code Playgroud)

该测试适用于单个级别的许多对象(即宽和浅) …

c# xmldocument xmlreader xml-serialization

61
推荐指数
2
解决办法
5万
查看次数

在C#代码中解析(大)XML的最佳方法是什么?

我正在用C#编写一个GIS客户端工具,以从服务器中检索基于GML的XML模式(下面的示例)中的"功能".提取物限制为100,000个功能.

我猜测最大的extract.xml可能会增加大约150兆字节,所以很明显DOM解析器已经出来我一直试图在XmlSerializerXSD.EXE生成的绑定之间做出决定--OR-- XmlReader和手工制作的对象图.

或者也许有一种更好的方式我尚未考虑过?像XLINQ,或????

请任何人指导我吗?特别是关于任何给定方法的存储效率.如果不是,我将不得不"原型化"两种解决方案,并将它们并排分析.

我是.NET中的一个原始对象.任何指导将不胜感激.

感谢您.基思.


示例XML - 最多100,000个,每个功能最多234,600个coords.

<feature featId="27168306" fType="vegetation" fTypeId="1129" fClass="vegetation" gType="Polygon" ID="0" cLockNr="51598" metadataId="51599" mdFileId="NRM/TIS/VEGETATION/9543_22_v3" dataScale="25000">
  <MultiGeometry>
    <geometryMember>
      <Polygon>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>153.505004,-27.42196 153.505044,-27.422015 153.503992 .... 172 coordinates omitted to save space ... 153.505004,-27.42196</coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </geometryMember>
  </MultiGeometry>
</feature>
Run Code Online (Sandbox Code Playgroud)

c# xml xmlreader xml-serialization

59
推荐指数
4
解决办法
6万
查看次数

为什么我的公共属性不是由XmlSerializer序列化的?

这是我多年来一直在努力的一个,所以以为我会在某个地方记录.(对提问和回答问题表示歉意.)

(C#.net 2.0)我有一个由XmlSerializer序列化的类,我添加了一个新的公共属性,但它没有包含在输出XML中.

在我找不到的文档中没有提到它,但公共属性必须有一个集合以及一个序列化!我想这是因为它假设如果你要序列化然后你想要从同一个文件反序列化,所以只序列化同时具有set和get的属性.

.net c# xml-serialization

58
推荐指数
4
解决办法
4万
查看次数

XML序列化和名称空间前缀

我正在寻找一种使用C#的方法,我可以将类序列化为XML并添加命名空间,但是定义该命名空间将使用的前缀.

最终我正在尝试生成以下XML:

<myNamespace:Node xmlns:myNamespace="...">
  <childNode>something in here</childNode>
</myNamespace:Node>
Run Code Online (Sandbox Code Playgroud)

我知道有两个DataContractSerializerXmlSerializer我可以添加一个命名空间,但他们似乎在内部生成一个前缀,与我不能够控制的东西.我能用这些序列化器控制它(我可以使用其中任何一个)吗?

如果我无法控制名称空间的生成,我需要编写自己的XML序列化程序,如果是这样,那么编写它的最佳选择是什么?

c# xml-serialization datacontractserializer xmlserializer

58
推荐指数
2
解决办法
9万
查看次数

使用DataContractSerializer"输入不是预期的" - 但它只是一个简单的类,没有有趣的东西?

我正在重构我的XML序列化,并认为我会尝试使用DataContractSerializer.一切都运行顺利,直到它需要序列化这个类:

using System;
using System.Runtime.Serialization;

namespace VDB_Sync.Model
{
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
{
    [DataMember]
    private MySqlDbType mydataType;
    [DataMember]
    private object value;

    public Konstant(string navn, MySqlDbType dataType, object value)
        : base(navn, dataType, "*Konstant", false, false)
    {
        //this.navn = navn;
        this.mydataType = dataType;
        this.value = value;

        if (navn.Contains("*Løbenummer"))
        {
            navn = "*Konstant: " + Convert.ToString(value);
        }
    }

    public object Value
    {
        get
        {
            return value;
        }
    }

}
}
Run Code Online (Sandbox Code Playgroud)

它给了我这个:

键入"VDB_Sync.Model.Konstant",数据合同名称为"Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model",不是预期的.考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.

*到目前为止我找到的帮助指向了集合和类型.我的类中有一个枚举(MySqlDbType) - 但是得到这个:当我没有声明DataMembers时,我甚至得到了同样的错误:-x那么 - 这里发生了什么?我错过了什么?

作为参考,这是我如何序列化它,VDB_SessionController是根:*

    public …
Run Code Online (Sandbox Code Playgroud)

.net xml serialization xml-serialization datacontractserializer

58
推荐指数
3
解决办法
6万
查看次数

将属性序列化为Element中的Xml属性

我有以下课程:

[Serializable]
public class SomeModel
{
    [XmlElement("SomeStringElementName")]
    public string SomeString { get; set; }

    [XmlElement("SomeInfoElementName")]
    public int SomeInfo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

哪个(当填充一些测试数据时)和使用XmlSerializer.Serialize()进行序列化会产生以下XML:

<SomeModel>
  <SomeStringElementName>testData</SomeStringElementName>
  <SomeInfoElementName>5</SomeInfoElementName>
</SomeModel>
Run Code Online (Sandbox Code Playgroud)

我需要的是:

<SomeModel>
  <SomeStringElementName Value="testData" />
  <SomeInfoElementName Value="5" />
</SomeModel>
Run Code Online (Sandbox Code Playgroud)

有没有办法在不编写自己的自定义序列化代码的情况下将其指定为属性?

.net c# xml xml-serialization

58
推荐指数
2
解决办法
11万
查看次数

在XML中反序列化为没有容器元素的List

在我看到的所有示例中,XmlSerializer无论何时使用列表或数组,您都会遇到某种类似容器的元素:

<MyXml>
  <Things>
    <Thing>One</Thing>  
    <Thing>Two</Thing>  
    <Thing>Three</Thing>  
  </Things>
</MyXml>
Run Code Online (Sandbox Code Playgroud)

但是,我所拥有的XML没有类似上面的东西的容器.它只是开始重复元素.(顺便提一下,XML实际上来自Google的Geocode API)

所以,我有这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
  <status>OK</status>
  <result>
    <type>locality</type>
    <type>political</type>
    <formatted_address>Glasgow, City of Glasgow, UK</formatted_address>
    <address_component>
      <long_name>Glasgow</long_name>
      <short_name>Glasgow</short_name>
      <type>locality</type>
      <type>political</type>
    </address_component>
    <address_component>
      <long_name>East Dunbartonshire</long_name>
      <short_name>East Dunbartonshire</short_name>
      <type>administrative_area_level_3</type>
      <type>political</type>
    </address_component>
    <!-- etc... -->
  </result>
  <result>
    <!-- etc... -->
  </result>
  <result>
    <!-- etc... -->
  </result>
</GeocodeResponse>
Run Code Online (Sandbox Code Playgroud)

正如你可以看到里面的结果,类型元素重复没有XmlSerializer所期望的任何类型元素(或至少我见过的所有文档和示例)._address_component_也是如此.

我目前的代码看起来像这样:

[XmlRoot("GeocodeResponse")]
public class GeocodeResponse
{
    public GeocodeResponse()
    {
        this.Results = new List<Result>();
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# xml-serialization

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

过时的属性导致XmlSerialization忽略属性

我正在重构一些序列化为XML的对象,但需要保留一些属性以实现向后兼容性,我有一个方法可以将旧对象转换为新对象并使过时属性为空.我想使用该Obsolete属性告诉其他开发人员不要使用此属性,但它导致该属性被忽略XmlSerializer.

相似代码:

[Serializable]
public class MySerializableObject
{
    private MyObject _oldObject;
    private MyObject _anotherOldObject;

    private MyObject _newBetterObject;

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject OldObject
    {
      get { return _oldObject; }
      set { _oldObject = value; }
    }

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject AnotherOldObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject = value; }
    }

    public MyObject NewBetterObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject …
Run Code Online (Sandbox Code Playgroud)

c# attributes xml-serialization .net-2.0

52
推荐指数
2
解决办法
9205
查看次数

在xml序列化期间忽略属性,但在反序列化期间不忽略

在C#中,如何在序列化期间使XmlSerializer忽略属性,而不是在反序列化期间忽略属性?(或者我如何对Json.net做同样的事情?)

要阻止属性序列化,可以添加XmlIgnore属性:

[XmlIgnore]
public int FooBar {get;set;}
Run Code Online (Sandbox Code Playgroud)

这将导致<FooBar>在序列化期间省略标记.

但是,这也意味着<FooBar>在反序列化期间将忽略标记.

在我的例子中,我在请求中接受来自用户的一系列项目,并且对于每个项目,如果用户想要添加,修改或删除项目,则可以指定动作属性.我想为GET列表调用使用相同的模型对象,并且不想返回此action属性.我希望这是一个很常见的情况.

另一个用例:说你有一个圆形对象

public class Circle
{
    public double Radius { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并修改它以添加直径属性

public class Circle2
{
    public double Diameter { get; set; }
    public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }
}
Run Code Online (Sandbox Code Playgroud)

您可能只想序列化直径,但仍能够以旧格式反序列化仅包含半径的xml文件.

我做了我的研究并没有找到任何东西,因此这个问题

解决方案:我找到了解决方案.我可以在此MSDN文档中添加一个始终返回false的ShouldSerialize属性

(如果重新打开此问题,可以将此解决方案添加为实际答案)

.net c# xml-serialization json.net deserialization

49
推荐指数
2
解决办法
4万
查看次数