{"<ব্যবহারকারীর xMLns = ''> প্রত্যাশিত ছিল না ML টুইটার এক্সএমএলকে deserializing


211

আমি টুইটার থেকে ওআউথের মাধ্যমে এক্সএমএল টানছি।

আমি http://twitter.com/account/verify_credentials.xML- তে একটি অনুরোধ করছি , যা নিম্নলিখিত এক্সএমএলটি প্রদান করে:

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <id>16434938</id>
  <name>Lloyd Sparkes</name>
  <screen_name>lloydsparkes</screen_name>
  <location>Hockley, Essex, UK</location>
  <description>Student</description>
  <profile_image_url>http://a3.twimg.com/profile_images/351849613/twitterProfilePhoto_normal.jpg</profile_image_url>
  <url>http://www.lloydsparkes.co.uk</url>
  <protected>false</protected>
  <followers_count>115</followers_count>
  <profile_background_color>9fdaf4</profile_background_color>
  <profile_text_color>000000</profile_text_color>
  <profile_link_color>220f7b</profile_link_color>
  <profile_sidebar_fill_color>FFF7CC</profile_sidebar_fill_color>
  <profile_sidebar_border_color>F2E195</profile_sidebar_border_color>
  <friends_count>87</friends_count>
  <created_at>Wed Sep 24 14:26:09 +0000 2008</created_at>
  <favourites_count>0</favourites_count>
  <utc_offset>0</utc_offset>
  <time_zone>London</time_zone>
  <profile_background_image_url>http://s.twimg.com/a/1255366924/images/themes/theme12/bg.gif</profile_background_image_url>
  <profile_background_tile>false</profile_background_tile>
  <statuses_count>1965</statuses_count>
  <notifications>false</notifications>
  <geo_enabled>false</geo_enabled>
  <verified>false</verified>
  <following>false</following>
  <status>
    <created_at>Mon Oct 12 19:23:47 +0000 2009</created_at>
    <id>4815268670</id>
    <text>&#187; @alexmuller your kidding? it should all be &quot;black tie&quot; dress code</text>
    <source>&lt;a href=&quot;http://code.google.com/p/wittytwitter/&quot; rel=&quot;nofollow&quot;&gt;Witty&lt;/a&gt;</source>
    <truncated>false</truncated>
    <in_reply_to_status_id>4815131457</in_reply_to_status_id>
    <in_reply_to_user_id>8645442</in_reply_to_user_id>
    <favorited>false</favorited>
    <in_reply_to_screen_name>alexmuller</in_reply_to_screen_name>
    <geo/>
  </status>
</user>

আমি নিম্নলিখিত কোডটি ডিসেরায়ালাইজ করতে ব্যবহার করছি:

    public User VerifyCredentials()
    {
        string url = "http://twitter.com/account/verify_credentials.xml";
        string xml = _oauth.oAuthWebRequestAsString(oAuthTwitter.Method.GET, url, null);

        XmlSerializer xs = new XmlSerializer(typeof(User),"");

        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));

        return (User)xs.Deserialize(ms);
    }

এবং আমার Userক্লাসের জন্য নিম্নলিখিতগুলি রয়েছে :

 [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class User
{

    [XmlElement(ElementName = "id")]       
    public long Id { get; set; }

    [XmlElement(ElementName = "name")] 
    public string Name { get; set; }

    [XmlElement(ElementName = "screen_name")]       
    public string ScreenName { get; set; }

    [XmlElement(ElementName = "location")]       
    public string Location { get; set; }

    [XmlElement(ElementName = "description")]      
    public string Description { get; set; }

    [XmlElement(ElementName = "profile_image_url")]      
    public string ProfileImageUrl { get; set; }

    [XmlElement(ElementName = "url")]       
    public string Url { get; set; }

    [XmlElement(ElementName = "protected")]      
    public bool Protected { get; set; }

    [XmlElement(ElementName = "followers_count")]      
    public int FollowerCount { get; set; }

    [XmlElement(ElementName = "profile_background_color")]       
    public string ProfileBackgroundColor { get; set; }

    [XmlElement(ElementName = "profile_text_color")]       
    public string ProfileTextColor { get; set; }

    [XmlElement(ElementName = "profile_link_color")]       
    public string ProfileLinkColor { get; set; }

    [XmlElement(ElementName = "profile_sidebar_fill_color")]       
    public string ProfileSidebarFillColor { get; set; }

    [XmlElement(ElementName = "profile_sidebar_border_color")]      
    public string ProfileSidebarBorderColor { get; set; }

    [XmlElement(ElementName = "friends_count")]     
    public int FriendsCount { get; set; }

    [XmlElement(ElementName = "created_at")]     
    public string CreatedAt { get; set; }

    [XmlElement(ElementName = "favourties_count")]      
    public int FavouritesCount { get; set; }

    [XmlElement(ElementName = "utc_offset")]      
    public int UtcOffset { get; set; }

    [XmlElement(ElementName = "time_zone")]       
    public string Timezone { get; set; }

    [XmlElement(ElementName = "profile_background_image_url")]        
    public string ProfileBackgroundImageUrl { get; set; }

    [XmlElement(ElementName = "profile_background_tile")]        
    public bool ProfileBackgroundTile { get; set; }

    [XmlElement(ElementName = "statuese_count")]        
    public int StatusesCount { get; set; }

    [XmlElement(ElementName = "notifications")]       
    public string Notifications { get; set; }

    [XmlElement(ElementName = "geo_enabled")]       
    public bool GeoEnabled { get; set; }

    [XmlElement(ElementName = "Verified")]        
    public bool Verified { get; set; }

    [XmlElement(ElementName = "following")]
    public string Following { get; set; }

    [XmlElement(ElementName = "status", IsNullable=true)]
    public Status CurrentStatus { get; set; }

}

কিন্তু যখন এটি উপরের এক্সএমএলকে ডিসরিয়ালাইজ করছে তখন অ্যাপ্লিকেশনটি নিম্নলিখিতটি ছুঁড়ে ফেলেছে:

  • $ ব্যতিক্রম {"এক্সএমএল ডকুমেন্টে একটি ত্রুটি রয়েছে (2, 2)"} সিস্টেম.অগ্রহ {সিস্টেম.অনুষ্ঠানিক অপারেশন এক্সেক্সশন}

  • অভ্যন্তরীণ ধারণা {"<ব্যবহারকারীর xMLns = ''> প্রত্যাশিত ছিল না" "। সিস্টেম.এক্সেপশন {সিস্টেম.অনুদ্দীপক অপসারণ}

এখন আমি চারপাশে অনুসন্ধান করেছি এবং আমি যে সর্বোত্তম সমাধানটি খুঁজে পেতে পারি তা হ'ল সিরিয়ালাইজারে ফাঁকা নেমস্পেস যুক্ত করা যখন আপনি বিষয়বস্তুটি সিরিয়াল করবেন, তবে আমি এটি সিরিয়াল করছি না তাই আমি পারছি না।

আমার কাছে স্ট্যাটাসগুলি পাওয়ার জন্য কিছু কোডও রয়েছে, যা সূক্ষ্মভাবে কাজ করে।

তাহলে কেউ আমাকে ব্যাখ্যা করতে পারে যে ত্রুটি কেন ঘটছে? পাশাপাশি একটি সম্ভাব্য সমাধান?

আগাম ধন্যবাদ.


আমার ক্ষেত্রে, এটি ভুল ঘোষণার কারণে হয়েছিল XmlSerializer। সুতরাং এটি পরীক্ষা করে দেখুন।
মঙ্গেশ

আমাকে ক্লাসে এক্সএমএল এ্যাট্রিবিউটের সাথে ফিল্ড যুক্ত করতে হয়েছিল। লিঙ্কটি
স্টেফান ভার্গা

উত্তর:


263

হয় আপনার XMLRoot বৈশিষ্ট্য যা আপনার সংকলন সময়ে ব্যবহার করা হবে তার মূল সত্তা সাজাই।

[XmlRoot(Namespace = "www.contoso.com", ElementName = "MyGroupName", DataType = "string", IsNullable=true)]

অথবা রানটাইমের সময় সিরিয়াল করার সময় মূল বৈশিষ্ট্য নির্দিষ্ট করুন।

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "user";
// xRoot.Namespace = "http://www.cpandl.com";
xRoot.IsNullable = true;

XmlSerializer xs = new XmlSerializer(typeof(User),xRoot);

6
তুমি ক্লাসে একটি XmlRoot অ্যাট্রিবিউট যোগ করতে পারিনি msdn.microsoft.com/en-us/library/83y7df3e(VS.71).aspx [XmlRoot (নামস্থান = "www.contoso.com", ElementName = "MyGroupName", ডাটাটাইপ = "স্ট্রিং", ইসনুলযোগ্য = সত্য)]
ডেভিড ভ্যালেন্টাইন

39
এক্সএমএল কেস-সংবেদনশীল। "ব্যবহারকারী" এবং "ব্যবহারকারী" আলাদা আলাদা নাম।
জন স্যান্ডার্স

4
আমি নিম্নোক্ত হয়েছি কারণ আমি অনুভব করি যে এক্সএমআরল তথ্যগুলি শ্রেণীর উপরই সংজ্ঞায়িত করা উচিত, যেখানে এটি ডিসেরিয়ালাইজ করা হচ্ছে না। এই রিওনের জন্য, জুন্টোর সমাধানটি আমার মতে, উচ্চতর।
গুইসিম

4
@ গুইসিম আপনি ধরে নিচ্ছেন যে ওপির মূল সত্তার উপর নিয়ন্ত্রণ রয়েছে। উভয় উত্তর বৈধ। আমার ক্ষেত্রে আমি সত্ত্বায় XMLRoot যুক্ত করতে পারি না কারণ এটি কোনও বার্তা চুক্তির অংশ হিসাবে ব্যবহৃত হয়। উপরের পদ্ধতিটি ব্যবহার করা আমার দৃশ্যের জন্য কাজ করে।
ব্রোনমস্কি

4
@ গুইসিম, ওপি যা বলেছিল তাতে আমি একমত নই। আমার আমার মূল অস্তিত্বের সম্পূর্ণ নিয়ন্ত্রণ আছে তবে রুটট্রিবিউট ব্যবহার করতে পারি না কারণ এটি মেসেজকন্ট্রাক্ট বৈশিষ্ট্যের সাথে সাংঘর্ষিক। উভয় উত্তর বৈধ এবং বিকল্প মন্তব্যে উপস্থাপিত হয়েছিল। মুল বক্তব্যটি হ'ল আপনি কোনও সঠিক উত্তরকে ভুল উত্তর না দিয়ে ভোট দিচ্ছেন। আপনি যদি একমত না হন যে এটি সর্বোত্তম just
ব্রোনমস্কি


25
XmlSerializer xs = new XmlSerializer(typeof(User), new XmlRootAttribute("yourRootName")); 

2
এটি মামলার ক্ষেত্রে দুর্দান্ত যেখানে অন্যথায় আপনাকে গুনের জন্য শর্তাবলীর উপর নির্ভর করতে হবে।
ডেন ডিলিমারস্কি

2
খুব সহজ এবং আমার কেস পুরোপুরি ঠিক করে দিয়েছে। ধন্যবাদ!
এডাব্লু

12

ত্রুটি বার্তাটি এত অস্পষ্ট, আমার কাছে এই কোডটি ছিল:

var streamReader = new StreamReader(response.GetResponseStream());
var xmlSerializer = new XmlSerializer(typeof(aResponse));
theResponse = (bResponse) xmlSerializer.Deserialize(streamReader);

বিজ্ঞপ্তি এক্সএমএলসিরাইজারটি রিস্পন্স দিয়ে তাত্ক্ষণিকভাবে চালু করা হয়েছে তবে ডিসিরিয়ালেজ করার সময় আমি ঘটনাক্রমে এটিকে বি রিসোনে কাস্ট করেছি।


2
সবেমাত্র একই সমস্যা ছিল। xmlserializer টাইপফ (টি) থেকে আরম্ভ করা হয়েছিল এবং আমি <T>
নুরেটিন

1
আমি অভিভাবক শ্রেণীর XmlRoot(..)শিশু শ্রেণিতে ঘোষণা করেছিলাম । আমি এর পরিবর্তে ব্যবহার করেছি এবং এটিতে আপত্তিও পোষ্ট করেছি। নির্দেশ করার জন্য ধন্যবাদ! ClassBClassAnew XmlSerializer(typeof(ClassA)ClassB
শিশির গুপ্ত

6

সবচেয়ে সহজ এবং সর্বোত্তম সমাধানটি হল আপনার ক্লাসে এক্সএমআরল অ্যাট্রিবিউটটি ব্যবহার করা , যাতে আপনি deserialize করতে চান।

ভালো লেগেছে:

[XmlRoot(ElementName = "YourPreferableNameHere")]
public class MyClass{
...
}

এছাড়াও, নিম্নলিখিত সমাবেশটি ব্যবহার করুন :

using System.Xml.Serialization;

3
কেউ ব্যাখ্যা দিতে চান? কেন হয় XmlRoot()অ্যাট্রিবিউট এই সমস্যাটির সমাধান করা প্রয়োজন? এখানে 5 টি উত্তর রয়েছে যা বলে যে "কেবল এই কোডটি যুক্ত করুন" এবং একটির ব্যাখ্যা নেই। লোকেরা 7 বছর পরে উত্তর দিচ্ছে এবং এটি এখনও ঠিক, "এই এক্সএমএল রুট কোড যুক্ত করুন"। সমস্ত উত্তরগুলির মধ্যে আমি একটি ব্যাখ্যা জিজ্ঞাসা করার জন্য নতুনটি বেছে নিয়েছি।
কোয়ান্টিক

থানকিউ @ কোয়ান্টিক, এক্সএমএল রুট আপনাকে ডিফল্ট রুট ব্যবহার না করে একটি নতুন এক্সএমএল মান তৈরি করতে দেয় যা আপনি এটি অনুকূলিত করতে পারেন। এটি কেবল প্রকারের সজ্জা আপনি সংকলনের সময় আপনার এক্সএমএল যুক্ত করবেন। কিছু সময় সামঞ্জস্যের সমস্যাগুলি দূর করবে। আশা করি আপনি আমার বক্তব্য পাবেন।
খাজা অসীম

5

জন স্যান্ডার্স যেমন বলেছে, আপনার এক্সএমএলের ক্যাপিটাল কেসিংয়ের সাথে শ্রেণি / সম্পত্তির নাম মেলে কিনা তা পরীক্ষা করে দেখুন। যদি এটি না হয় তবে সমস্যাটিও ঘটবে।


2

আমার সমস্যাটি ছিল আমার উপাদানগুলির মধ্যে একটিতে এক্সএমএনএল বৈশিষ্ট্য ছিল:

<?xml version="1.0" encoding="utf-8"?>
<RETS ReplyCode="0">
    <RETS-RESPONSE xmlns="blahblah">
        ...
    </RETS-RESPONSE>
</RETS>

আমি xMLns অ্যাট্রিবিউটটি যা চেষ্টা করেছিলাম তা সিরিয়ালাইজারটি ভেঙে যাচ্ছে বলে মনে হচ্ছে, তাই আমি xMLns = "..." এর কোনও সন্ধান xML ফাইল থেকে সরিয়েছি:

<?xml version="1.0" encoding="utf-8"?>
<RETS ReplyCode="0">
    <RETS-RESPONSE>
        ...
    </RETS-RESPONSE>
</RETS>

ও ভয়েলা! সব কাজ।

আমি এখন ডেসরিয়ালাইজ করার আগে এই অ্যাট্রিবিউটটি সরাতে এক্সএমএল ফাইলটি পার্স করছি। এটি কেন কাজ করে তা নিশ্চিত নয়, xMLns বৈশিষ্ট্যযুক্ত উপাদানটি মূল উপাদান নয় বলেই আমার কেসটি ভিন্ন।


আপনার ফাইলটি উল্লেখ করেছে যে RETS-RESPONSE "blahblah" নেমস্পেসে ছিল। এটি যদি আপনার স্কিমার সাথে মেলে না, তবে উপাদানটি খুঁজে পাওয়া যেত না। এছাড়াও, একটি ডিফল্ট নেমস্পেস যোগ করার ফলেও অন্যান্য প্রকারের বিভিন্ন প্রকারের সমস্যা দেখা দেয়।
সানকাট 2000

2

আমার ক্ষেত্রে কাজ করা একমাত্র কাজটি ছিল ডেভিড ভ্যালেন্টাইন কোড ব্যবহার করে। রুট অ্যাটার ব্যবহার করা হচ্ছে। ব্যক্তি শ্রেণিতে সাহায্য করেনি।

আমার এই সাধারণ এক্সএমএল রয়েছে:

<?xml version="1.0"?>
<personList>
 <Person>
  <FirstName>AAAA</FirstName>
  <LastName>BBB</LastName>
 </Person>
 <Person>
  <FirstName>CCC</FirstName>
  <LastName>DDD</LastName>
 </Person>
</personList>

সি # শ্রেণি:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

একটি প্রধান পদ্ধতি থেকে ডি-সিরিয়ালাইজেশন সি # কোড:

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "personList";
xRoot.IsNullable = true;
using (StreamReader reader = new StreamReader(xmlFilePath))
{
List<Person> result = (List<Person>)(new XmlSerializer(typeof(List<Person>), xRoot)).Deserialize(reader);
 int numOfPersons = result.Count;
}  

2

আমার ক্ষেত্রে, আমার এক্সএমএল এর একাধিক নেমস্পেস এবং বৈশিষ্ট্য ছিল। সুতরাং আমি এই সাইটটি অবজেক্ট তৈরি করতে ব্যবহার করেছি - https://xmltocsharp.azurewebsites.net/

এবং ডিসিরিয়ালাইজ করতে নীচের কোডটি ব্যবহার করেছেন

 XmlDocument doc =  new XmlDocument();
        doc.Load("PathTo.xml");
        User obj;
        using (TextReader textReader = new StringReader(doc.OuterXml))
        {
            using (XmlTextReader reader = new XmlTextReader(textReader))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(User));
                obj = (User)serializer.Deserialize(reader);
            }
        }

লিঙ্কটি ক্লাসে এক্সএমএলকে ডিসেরায়ালাইজ করতে বিশাল সহায়তা দিয়েছে provided
smr5

1

আমার সমস্যাটি হ'ল মূল উপাদানটির আসলে একটি xMLns = "abc123" থাকে

সুতরাং XMLRoot ("উপাদান নাম", নেমস্পেস = "abc123") করতে হয়েছিল


1

উপরের সমস্তটি আমার পক্ষে কাজ করেনি, তবে এটি ছিল: ক্লাসের রুটের উপাদানটির নামটি ঠিক এক্সএমএল কেস সংবেদনশীল ব্যক্তির মতো


1

এই ত্রুটিগুলি ছাড়াই আমার পক্ষে কিছুই কাজ করেনি

... was not expected, 
... there is an error in XML document (1,2)
... System.FormatException Input String was not in correct format ...

এই উপায় ব্যতীত

1- আপনাকে এক্সএমএল প্রতিক্রিয়াটি স্ট্রিং হিসাবে পরিদর্শন করতে হবে (যে প্রতিক্রিয়াটি আপনি কোনও বস্তুর ডি-সিরিয়ালাইজ করার চেষ্টা করছেন)

2- স্ট্রিং ইউনেস্কেপ এবং এক্সএমএল প্রিটিটিফাই / ফর্ম্যাটারের জন্য অনলাইন সরঞ্জামগুলি ব্যবহার করুন

3- নিশ্চিত করুন যে C # এর ক্লাস (প্রধান শ্রেণী) আপনি মানচিত্রে করার চেষ্টা করছেন / করতে XML স্ট্রিং deserialize এএন XmlRootAttribute রয়েছে যে প্রতিক্রিয়ার মূল উপাদান সাথে মেলে।

Exmaple:

আমার এক্সএমএল প্রতিক্রিয়াটি এমনভাবে দেখছিল:

<ShipmentCreationResponse xmlns="http://ws.aramex.net/ShippingAPI/v1/">
       <Transaction i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
           ....

এবং সি # শ্রেণীর সংজ্ঞা + বৈশিষ্ট্যগুলি ছিল:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="ShipmentCreationResponse", WrapperNamespace="http://ws.aramex.net/ShippingAPI/v1/", IsWrapped=true)]
public partial class ShipmentCreationResponse {
  .........
}

নোট করুন যে শ্রেণীর সংজ্ঞায় " XMLRootAttribute " নেই

[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://ws.aramex.net/ShippingAPI/v1/", IsNullable = false)]

এবং যখন আমি জেনেরিক পদ্ধতিটি ব্যবহার করে সিরিয়ালটিকে ডি করার চেষ্টা করি:

public static T Deserialize<T>(string input) where T : class
{
    System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));

    using (System.IO.StringReader sr = new System.IO.StringReader(input))
    {
        return (T)ser.Deserialize(sr);
    }
}





var _Response = GeneralHelper.XMLSerializer.Deserialize<ASRv2.ShipmentCreationResponse>(xml);

আমি উপরের ত্রুটিগুলি পেয়েছিলাম

... was not expected, ... there is an error in XML document (1,2) ...

এখন কেবলমাত্র "XMLRootAttribute" যুক্ত করে এই সমস্যাটি চিরতরে এবং প্রতিটি অনুরোধ / প্রতিক্রিয়াগুলির সাথে আমার সমস্যার সাথে স্থির করে:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://ws.aramex.net/ShippingAPI/v1/", IsNullable = false)]

..

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ws.aramex.net/ShippingAPI/v1/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://ws.aramex.net/ShippingAPI/v1/", IsNullable = false)]
public partial class ShipmentCreationResponse
{
    ........
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.