标签: xmlserializer

使用XmlSerializer读取UTF-16编码的XML文件

我正在调用WebService并获取从WebMethod返回的字符串.该字符串是序列化为XML的对象,应使用System.Xml.XmlSerializer进行反序列化.

我的问题是第一行表明该文档是UTF-16编码的:

<?xml version="1.0" encoding="utf-16"?>
Run Code Online (Sandbox Code Playgroud)

因此,当反序列化时,我得到错误:

There is an error in XML document (0, 0).
Run Code Online (Sandbox Code Playgroud)

它确实可以做string.Replace("utf-16","utf-8"),但必须有一个干净的方法让XmlSerializer知道吗?

.net xml xmlserializer

4
推荐指数
1
解决办法
2741
查看次数

XmlSerializer定义默认值

我们有一个带有一些用户设置的xml文档.我们刚刚添加了一个新设置(在旧版xml文档中找不到)并XmlSerializer自动将其设置为false.我试过DefaultValueAttribute但它不起作用.关于如何获得默认值的任何想法true?这是代码:

private bool _property = true;
[DefaultValueAttribute(true)]
public bool Property 
{
    get { return _property; }
    set
    {
        if (_property != value)
        {
            _property = value;
            this.IsModified = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

c# xmlserializer

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

C#中的XmlElement

我在C#中有一个简单的类,我已经设置了使用XmlSerializer类序列化为XML.

[Serializable, XmlRoot("dc", Namespace= dc.NS_DC)]
public class DCItem {

    // books??

    [XmlElement("title")]
    public string Title { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

DCItem序列化很好,因为代码现在正在设置(如上所示); 但是,我想更改属性"Title",以便它包含在"Books"节点中.例如:

<dc>
  <books>
    <title>Joe's Place</title>
  </books>
</dc>
Run Code Online (Sandbox Code Playgroud)

这样做的最佳方法是什么?

c# xmlserializer

4
推荐指数
1
解决办法
5752
查看次数

XML反序列化在DocType标记上失败

我正在与第三方应用程序集成,该应用程序向我们发送XML消息.他们的XML看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE theirObj SYSTEM "theirDTD-2.0.dtd">
<theirObj>
    <properties>
        <datasource>ThirdParty</datasource>
        <datetime>2009-03-05T14:45:39</datetime>
    </properties>
        <data>
          ...
        </data>
</theirObj>
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用XmlSerializer反序列化它:

public theirObj Deserialize(string message) {
            if( string.IsNullOrWhiteSpace( message ) ) {
                throw new ArgumentNullException( "message" );
            }
            XmlSerializer xmlSerializer = new XmlSerializer( typeof(theirObj ) );

            TextReader textReader = new StringReader( message );

            using (XmlReader xmlReader = new XmlTextReader( textReader )) {
                object deserializedObject = xmlSerializer.Deserialize( xmlReader );

                theirObj ent = deserializedObject as theirObj ;

                if (ent == null) {
                    throw new InvalidCastException("Unable …
Run Code Online (Sandbox Code Playgroud)

c# doctype xmlserializer

4
推荐指数
1
解决办法
3071
查看次数

XML url 中的 &amp; 符号未通过

我很难解决 URL 中与号 (&) 的这个小问题......我正在序列化 XML,如下所示......

    var ser = new XmlSerializer(typeof(response));
    using (var reader = XmlReader.Create(url))
    {
        response employeeResults = (response)ser.Deserialize(reader); //<<error when i pass with ampersand
    }
Run Code Online (Sandbox Code Playgroud)

如果&url 中没有,上面的代码工作正常,否则它会抛出一个错误(见下文)

我没有问题序列化这个网址:

http://api.host.com/api/employees.xml/?&search=john
Run Code Online (Sandbox Code Playgroud)

这个网址有问题:

http://api.host.com/api/employees.xml/?&max=20&page=10
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

`There is an error in XML document (1, 389).`
Run Code Online (Sandbox Code Playgroud)

PS:我确实尝试过传球&#038;,也尝试过&#38or#026&amp;- 没有运气。

.net c# xml xml-serialization xmlserializer

4
推荐指数
1
解决办法
5715
查看次数

FileMode.Open 和 FileMode.OpenOrCreate 文件存在时的区别?错误?

我写了这样的代码:

public void Save()
{
    using (FileStream fs = new FileStream(Properties.Settings.Default.settings_file_path, FileMode.Open))
    {
        XmlSerializer ser = new XmlSerializer(typeof(MySettings));
        ser.Serialize(fs, this);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用FileMode.Open一切都很好,输出是这样的:

<?xml version="1.0"?>
<MySettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <settingsList>
        <Setting>
            <Value>12</Value>
            <Name>A0</Name>
            <Type>MEASUREMENT</Type>
        </Setting>
        <Setting>
            <Value>5000</Value>
            <Name>C0</Name>
            <Type>MEASUREMENT</Type>
        </Setting>
    </settingsList>
</MySettings>
Run Code Online (Sandbox Code Playgroud)

但是当我将其更改为FileMode.OpenOrCreateoutput 时将更改为:

<?xml version="1.0"?>
<MySettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <settingsList>
        <Setting>
            <Value>12</Value>
            <Name>A0</Name>
            <Type>MEASUREMENT</Type>
        </Setting>
        <Setting>
            <Value>5000</Value>
            <Name>C0</Name>
            <Type>MEASUREMENT</Type>
        </Setting>
    </settingsList>
</MySettings>>
Run Code Online (Sandbox Code Playgroud)

是什么使整个 xml 文件由于>末尾的附加标志而损坏。

这是可以解释的还是它的 c# 错误?

c# xml serialization xml-serialization xmlserializer

4
推荐指数
1
解决办法
2612
查看次数

序列化没有额外元素的列表

我可以生成以下 XML 文档,但是我遇到了“ISKeyValueList”元素上的 version 属性的问题。我正在使用 xmlSerializer。我应该注意到这个 XML 被传递给一个 API,它需要如下的确切结构。

<Userdata>
  <ISKeyValueList  version="1.00">
     <Item type="String" key="AgeOfDependents">8,6,1<Item/>
     <Item type="Boolean" key="SecuritiesInPosession"> True </Item>
     <Item type="Boolean" key="SecuritiesOwners"> True </item>
  </ISKeyValueList>
</Userdata> 
Run Code Online (Sandbox Code Playgroud)

我已经阅读了几个堆栈溢出赏金,从中我了解到要将 version 属性添加到列表中,我必须将列表移动到另一个类中。下面生成了上面的结构,但是它添加了一个我想避免的额外元素。

C#

UserData newUserData = new UserData();
newUserData.ISKeyValueList = new DataProperties();
newUserData.ISKeyValueList.Items = new List<Item>()
{
   new Item()
   { 
      Type = "String", 
      Key = "AgeOfDependents", 
      //Add data from form
      Value = string.Join(",", application.applicants[0].ageOfDependants)  
    },
    new Item(){ Type = "Boolean", Key = "SecuritiesInPossession", Value = "True" }
    };

newClientDetails.UserData = newUserData;

//Pass …
Run Code Online (Sandbox Code Playgroud)

c# xml serialization xmlserializer

4
推荐指数
1
解决办法
1228
查看次数

XmlSerializer忽略WebApi中的[XmlAttribute]

我有一个WebApi返回一个简单的对象,但当我强制它返回XML(Accept: application/xml)时,它忽略了[XmlAttribute]我在对象上设置的属性.

这是我的目标:

public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在代码中将其返回:

[RoutePrefix("api/mytest")]
public class MyTestController : System.Web.Http.ApiController
{
    [HttpGet]
    [Route("gettest")]
    public Foo GetTest()
    {
        return new Foo() { Bar = "foobar" };
    }
}
Run Code Online (Sandbox Code Playgroud)

生成的XML是:

<Foo>
    <Bar>foobar</Bar>
</Foo>
Run Code Online (Sandbox Code Playgroud)

而我希望它会像这样返回:

<Foo Bar="foobar">
</Foo>
Run Code Online (Sandbox Code Playgroud)

为什么WebApi使用的XmlSerializer会忽略该[XmlAttribute]属性,如何让它像我想的那样工作?

c# xmlserializer asp.net-web-api

4
推荐指数
1
解决办法
1131
查看次数

使用XmlSerializer反序列化XML的替代方法

我正在编写UWP应用程序,并希望将xml中的列表反序列化为Objects列表:

<List>
    <Element Name="A">
        <SubElement Name="A1"> 
            <Color> Blue </Color> 
            <Color> Red </Color> 
        </SubElement>
        <SubElement Name="A2"> 
            <Color> Blue </Color> 
            <Color> Green </Color>  
        </SubElement>
    </Element>
    <Element Name="B">
        <SubElement Name="B1"> 
            <Color> Yellow </Color> 
            <Color> Red </Color> 
        </SubElement>
        <SubElement Name="B2"> 
            <Color> Yellow </Color> 
            <Color> Green </Color>  
        </SubElement>
    </Element>
    <Element Name="C"/>
        <SubElement Name="C1"> 
            <Color> Purple </Color> 
            <Color> Red </Color> 
        </SubElement>
        <SubElement Name="C2"> 
            <Color> Purple </Color> 
            <Color> Green </Color>  
        </SubElement>
    </Element>
</List> 
Run Code Online (Sandbox Code Playgroud)

这些类如下所示:

public class Element
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlElement("SubElement")] …
Run Code Online (Sandbox Code Playgroud)

c# xmlserializer uwp

4
推荐指数
1
解决办法
951
查看次数

XML反序列化期间的"未知节点:VarName"

我有这个示例XML文件,我需要反序列化:

<?xml version="1.0" encoding="utf-8"?>
<CollectionOfUnits>
    <Unit>
        <StringVar>TohleJeString</StringVar>
        <Int32Var>24</Int32Var>
        <DoubleVar>29.6</DoubleVar>
        <DateTimeVar>17.11.1968</DateTimeVar>
        <CharVar>c</CharVar>
    </Unit>
    <Unit>
        <StringVar>TohleJeTakéString</StringVar>
        <Int32Var>17</Int32Var>
        <DoubleVar>5.9</DoubleVar>
        <DateTimeVar>06.07.1415</DateTimeVar>
        <CharVar>p</CharVar>
    </Unit>
    <Unit>
        <StringVar>NoATohleTaké</StringVar>
        <Int32Var>2</Int32Var>
        <DoubleVar>78.5</DoubleVar>
        <DateTimeVar>06.12.1774</DateTimeVar>
        <CharVar>x</CharVar>
    </Unit>
</CollectionOfUnits>
Run Code Online (Sandbox Code Playgroud)

这是具有另一个类列表的根类:

[XmlRoot("CollectionOfUnits", IsNullable = false)]
public class XmlExampleCollectionOfUnits
{
    [XmlArray("Unit")]
    public List<XmlExampleBasicUnit> Units { get; set; }
    public XmlExampleCollectionOfUnits(List<XmlExampleBasicUnit> units)
    {
        Units = units;
    }
    public XmlExampleCollectionOfUnits()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

上面一节课的结构:

public class XmlExampleBasicUnit
{
    public String StringVar { get; set; }
    public Int32 Int32Var { get; set; }
    public Double DoubleVar { …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-deserialization xmlserializer

4
推荐指数
1
解决办法
54
查看次数