{[<उपयोगकर्ता xmlns = ''> अपेक्षित नहीं था।} ट्विटर XML का वर्णन करते हुए


211

मैं ट्विटर से XML में OAuth के माध्यम से खींच रहा हूं।

मैं http://twitter.com/account/verify_credentials.xml पर एक अनुरोध कर रहा हूं , जो निम्न 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>

मैं निम्नलिखित कोड का उपयोग Deserialize करने के लिए कर रहा हूं:

    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; }

}

लेकिन जब यह ऊपर एक्सएमएल deserializing है आवेदन निम्न फेंकता है:

  • $ अपवाद {"XML दस्तावेज़ (2, 2) में कोई त्रुटि है।"} System.Exception {System.InvalidOperationException}

  • भीतरी अपवाद {"<उपयोगकर्ता xmlns = ''> अपेक्षित नहीं था।"} System.Exception {System.InvalidOperationException}

अब मैंने चारों ओर खोज की है और सबसे अच्छा समाधान जो मैं पा सकता हूं वह है कि जब आप सामग्री को क्रमबद्ध करते हैं, तो धारावाहिक में रिक्त नामस्थान जोड़ना चाहते हैं, लेकिन मैं इसे क्रमबद्ध नहीं कर रहा हूं इसलिए मैं नहीं कर सकता।

मेरे पास Statuses प्राप्त करने के लिए कुछ कोड भी हैं, जो ठीक काम करता है।

तो क्या कोई मुझे समझा सकता है कि त्रुटि क्यों हो रही है? साथ ही एक संभावित समाधान?

अग्रिम में धन्यवाद।


मेरे मामले में, यह गलत घोषणा के कारण था XmlSerializer। तो वह भी जांच लें।
मंगेश

मुझे कक्षा में XmlAttribute के साथ फ़ील्ड जोड़ना पड़ा । लिंक
स्टीफन वर्गा

जवाबों:


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
आप msdn.microsoft.com/en-us/library/83y7df3e(VS.71).aspx [XmlRoot (Namespace = "www.contoso.com), ElementName =" MyGroupName ", DataType = में XmlRoot विशेषता जोड़ सकते हैं। "स्ट्रिंग", IsNullable = true)]
डेविड वैलेंटाइन

39
XML केस-सेंसिटिव है। "उपयोगकर्ता और उपयोगकर्ता" अलग-अलग नाम हैं।
जॉन सौन्डर्स

4
मैं नीचा दिखा रहा हूं क्योंकि मुझे लगता है कि XmlRoot की जानकारी को वर्ग पर ही परिभाषित किया जाना चाहिए, न कि जहां इसे deserialized किया जा रहा है। इस रीज़न के लिए, जूनो का समाधान, मेरी राय में, श्रेष्ठ है।
गुइसीम

4
@ गुईसिम आप मान रहे हैं कि ओपी का मूल इकाई पर नियंत्रण है। दोनों उत्तर मान्य हैं। मेरे मामले में मैं XmlRoot को इकाई में नहीं जोड़ सकता क्योंकि इसका उपयोग एक संदेश संदेश के भाग के रूप में किया जाता है। उपरोक्त विधि का उपयोग करना मेरे परिदृश्य के लिए काम करता है।
ब्रंसुम्स्की

4
@ GuiSim मैं ओपी ने जो कहा उससे मैं असहमत नहीं हूं। मेरे पास अपनी मूल इकाई का पूर्ण नियंत्रण है, लेकिन रूटटैटर का उपयोग नहीं कर सकते क्योंकि यह संदेशकंट्रैक्ट विशेषता के साथ संघर्ष करता है। दोनों उत्तर मान्य हैं और टिप्पणियों में विकल्प प्रस्तुत किया गया था। मुद्दा यह है कि आप गलत जवाब नहीं एक वैध जवाब मतदान कर रहे हैं। अगर आप इस बात से सहमत नहीं हैं कि यह सबसे अच्छा वोट नहीं है।
ब्रॉन्म्सकी


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

2
यह उन मामलों के लिए शानदार है जहां अन्यथा आपको विशेषताओं के लिए सशर्त पर निर्भर रहना होगा।
डेन डेलिमार्स्की

2
बहुत सरल और मेरे मामले को पूरी तरह से तय किया। धन्यवाद!
AW

12

त्रुटि संदेश बहुत अस्पष्ट है, मेरे लिए मेरे पास यह कोड था:

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

सूचना xmlSerializer को आरपेसन के साथ त्वरित किया जाता है, लेकिन deserializing पर मैंने गलती से इसे bResonse में डाल दिया।


2
बस इसी तरह की समस्या थी। xmlserializer को टाइपोफ़ (T) के लिए आरंभीकृत किया गया था और मैं
nurettin

1
मैंने अभिभावक वर्ग के XmlRoot(..)बच्चे को घोषित किया । मैंने इसके बजाय इस्तेमाल किया और इस पर ऑब्जेक्ट भी डाला । इशारा करने के लिए धन्यवाद! ClassBClassAnew XmlSerializer(typeof(ClassA)ClassB
शिशिर गुप्त

6

सबसे सरल और सबसे अच्छा समाधान सिर्फ अपनी कक्षा में XMLRoot विशेषता का उपयोग करना है , जिसमें आप डिसरिज़लाइज़ करना चाहते हैं।

पसंद:

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

इसके अलावा, निम्नलिखित विधानसभा का उपयोग करें :

using System.Xml.Serialization;

3
कोई स्पष्टीकरण देना चाहता है? इस समस्या को ठीक करने के लिए विशेषता की आवश्यकता क्यों है XmlRoot()? यहां 5 उत्तर दिए गए हैं जो कहते हैं, "बस इस कोड को जोड़ें" और एक स्पष्टीकरण नहीं। लोग 7 साल बाद जवाब दे रहे हैं और यह अभी भी है, "इस XmlRoot कोड जोड़ें"। सभी उत्तरों में से मैंने स्पष्टीकरण मांगने के लिए सबसे नया चुना।
क्वांटिक

Thankyou @Quantic, XmlRoot आपको डिफ़ॉल्ट रूट का उपयोग करने के बजाय एक नया xml मान बनाने की अनुमति देता है जिसे आप अनुकूलित कर सकते हैं। यह सिर्फ एक प्रकार की सजावट है जिसे आप संकलन समय पर अपने xml में जोड़ देंगे। संगतता समस्याओं को कुछ समय के लिए समाप्त कर देगा। आशा है आप मेरी बात मानेंगे।
ख्वाजा आसिम

5

जैसा कि जॉन सॉन्डर्स कहते हैं, जांचें कि क्या क्लास / प्रॉपर्टी के नाम आपके एक्सएमएल की पूंजी आवरण से मेल खाते हैं। यदि यह मामला नहीं है, तो समस्या भी होगी।


2

मेरी समस्या मेरे तत्वों में से एक थी xmlns विशेषता:

<?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>

और आवाज! सब कुछ काम कर गया।

अब मैं desmlializing से पहले इस विशेषता को हटाने के लिए xml फ़ाइल को पार्स करता हूं। निश्चित नहीं है कि यह क्यों काम करता है, शायद मेरा मामला अलग है क्योंकि xmlns विशेषता वाला तत्व रूट तत्व नहीं है।


आपकी फ़ाइल निर्दिष्ट करती है कि RETS-RESPONSE "blahblah" नामस्थान में था। यदि वह आपके स्कीमा से मेल नहीं खाता, तो तत्व नहीं मिला होता। इसके अलावा, एक डिफ़ॉल्ट नाम स्थान जोड़ने से अन्य संदर्भ समस्याओं का भी सभी प्रकार का कारण बनता है।
सनकैट २००

2

केवल एक चीज जो मेरे मामले में काम करती थी, वह है डेविड वैलेंटाइन कोड। रूट Attr का उपयोग करना। व्यक्ति वर्ग में मदद नहीं की।

मेरे पास यह सरल Xml है:

<?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

मेरे मामले में, मेरे xml में कई नामस्थान और विशेषताएँ थीं। इसलिए मैंने वस्तुओं को उत्पन्न करने के लिए इस साइट का उपयोग किया - https://xmltocsharp.azurewebsites.net/

और deserialize करने के लिए नीचे दिए गए कोड का उपयोग किया

 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);
            }
        }

लिंक ने क्लास को एक्सएमएल को डिसेर्बलाइज करने में बहुत बड़ी मदद दी।
18

1

मेरा मुद्दा यह था कि मूल तत्व वास्तव में एक xmlns = "abc123" है

तो XmlRoot ("elementname", NameSpace = "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- स्ट्रिंग unescape और xml prettify / formatter के लिए ऑनलाइन टूल का उपयोग करें

3- यह सुनिश्चित करें कि आप जिस C # क्लास (मुख्य वर्ग) का नक्शा तैयार कर रहे हैं / xml string को HAS AN XmlRootAttribute जो प्रतिक्रिया के मूल तत्व से मेल खाता है, को डिस्क्राइबलाइज करें

उदाहरण के:

मेरा XML प्रतिक्रिया जैसा दिख रहा था:

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

और C # वर्ग परिभाषा + विशेषताएँ इस प्रकार थीं:

[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
{
    ........
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.