Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当元素的大小写不一致时,反序列化/读取xml。_C#_Xml_Parsing_Deserialization - Fatal编程技术网

C# 当元素的大小写不一致时,反序列化/读取xml。

C# 当元素的大小写不一致时,反序列化/读取xml。,c#,xml,parsing,deserialization,C#,Xml,Parsing,Deserialization,我目前很高兴为第三方编写一个接口,该第三方出色的Web服务根据响应类型以不同的xml大小写响应。即使给出相同的请求,根据结果是否成功、错误、错误类型等,外壳也会有所不同。你明白了,这是一场噩梦 据我所知,没有不区分大小写的反序列化程序可用。 到目前为止,我所做的最好的事情就是将xml解析成一个XElement,并尝试一些常用的大小写,如Pasal大小写、Camel大小写、小写等 有更好的建议吗?一个选项是在反序列化之前使用XSLT转换将所有节点和属性名称转换为小写。有关必要的XSLT转换,以及在

我目前很高兴为第三方编写一个接口,该第三方出色的Web服务根据响应类型以不同的xml大小写响应。即使给出相同的请求,根据结果是否成功、错误、错误类型等,外壳也会有所不同。你明白了,这是一场噩梦

据我所知,没有不区分大小写的反序列化程序可用。 到目前为止,我所做的最好的事情就是将xml解析成一个XElement,并尝试一些常用的大小写,如Pasal大小写、Camel大小写、小写等


有更好的建议吗?

一个选项是在反序列化之前使用XSLT转换将所有节点和属性名称转换为小写。有关必要的XSLT转换,以及在c#中使用XSLT转换的说明,请参阅

另一个选项是使用JSON.NET将XML转换为JSON,如中所示,然后使用JSON.NET反序列化,即。您需要注意XML和JSON之间的一个不一致性,即JSON有数组的概念,而XML没有,因此使用重复元素来表示数组。Json.NET检测重复元素并将其转换为数组,但当XML数组只有一个元素时,不会发生这种情况。在这种情况下,有必要按照中的说明将
json:Array='true'
属性添加到XML中

因此,您可以引入以下扩展方法:

public static class JsonExtensions
{
    const string JsonNamespace = @"http://james.newtonking.com/projects/json";
    const string ArrayAttributeName = @"Array";

    public static JToken ToJToken(this XElement xElement, bool omitRootObject, string deserializeRootElementName)
    {
        return xElement.ToJToken(omitRootObject, deserializeRootElementName, Enumerable.Empty<Func<XElement, IEnumerable<XElement>>>());
    }

    public static JToken ToJToken(this XElement xElement, bool omitRootObject, string deserializeRootElementName, IEnumerable<Func<XElement, IEnumerable<XElement>>> arrayQueries)
    {
        foreach (var query in arrayQueries)
        {
            var name = XName.Get(ArrayAttributeName, JsonNamespace);
            foreach (var element in query(xElement))
            {
                element.SetAttributeValue(name, true);
            }
        }

        // Convert to Linq to XML JObject
        var settings = new JsonSerializerSettings { Converters = { new XmlNodeConverter { OmitRootObject = omitRootObject, DeserializeRootElementName = deserializeRootElementName } } };
        var root = JToken.FromObject(xElement, JsonSerializer.CreateDefault(settings));
        return root;
    }
}
公共静态类JsonExtensions
{
常量字符串JsonNamespace=@”http://james.newtonking.com/projects/json";
常量字符串ArrayAttributeName=@“数组”;
公共静态JToken to JToken(此XElement XElement、bool-omitRootObject、字符串反序列化ZerooteElementName)
{
返回xElement.ToJToken(省略rootobject,反序列化zerootelementname,Enumerable.Empty());
}
公共静态JToken-ToJToken(此XElement-XElement、bool-omitRootObject、字符串反序列化ZerooteElementName、IEnumerable arrayQueries)
{
foreach(arrayQueries中的var查询)
{
var name=XName.Get(ArrayAttributeName,JsonNamespace);
foreach(查询中的var元素(xElement))
{
元素SetAttributeValue(名称,true);
}
}
//将Linq转换为XML JObject
var settings=new JsonSerializerSettings{Converters={new XmlNodeConverter{OmitRootObject=OmitRootObject,deserializerotelementname=deserializerotelementname}};
var root=JToken.FromObject(xElement、JsonSerializer.CreateDefault(设置));
返回根;
}
}
然后,给定以下XML:

<root>
  <perSon ID='1'>
    <name>Alan</name>
    <url>http://www.google.com</url>
  </perSon>
</root>

艾伦
http://www.google.com
以及以下类型:

public class Person
{
    public string Name { get; set; }
    public string URL { get; set; }
    [XmlAttribute(AttributeName = "id")]
    [JsonProperty("@id")]
    public string Id { get; set; }
}

public class Root
{
    [XmlElement]
    public List<Person> Person { get; set; }
}
公共类人物
{
公共字符串名称{get;set;}
公共字符串URL{get;set;}
[XmlAttribute(AttributeName=“id”)]
[JsonProperty(“@id”)]
公共字符串Id{get;set;}
}
公共类根
{
[XmlElement]
公共列表人员{get;set;}
}
可以按如下方式反序列化XML:

var xElement = XElement.Parse(xml);
var jToken = xElement.ToJToken(true, "", 
    new Func<XElement, IEnumerable<XElement>> [] { e => e.Elements().Where(i => string.Equals(i.Name.LocalName, "Person", StringComparison.OrdinalIgnoreCase)) });

var root = jToken.ToObject<Root>();
var-xElement=xElement.Parse(xml);
var jToken=xElement.ToJToken(true,“,
新的Func[]{e=>e.Elements()。其中(i=>string.Equals(i.Name.LocalName,“Person”,StringComparison.OrdinalIgnoreCase))});
var root=jToken.ToObject();

示例。

另请参见可能的重复项。您可以使用JSON.NET将XML转换为JSON,如中所示,然后使用JSON.NET反序列化,不区分大小写。另一个选项是创建
XmlReader
,如图所示和(在链接XmlReaders下)然后对decorator进行子类化,并将所有元素和属性名都降格。@使用Json.NET的dbc工作得非常好。这真的帮我省去了很多麻烦。谢谢