我正在调用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知道吗?
我们有一个带有一些用户设置的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类序列化为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)
这样做的最佳方法是什么?
我正在与第三方应用程序集成,该应用程序向我们发送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) 我很难解决 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:我确实尝试过传球&,也尝试过&or#026或&- 没有运气。
我写了这样的代码:
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# 错误?
我可以生成以下 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) 我有一个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]属性,如何让它像我想的那样工作?
我正在编写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) 我有这个示例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)