2009-07-15 8 views
15

मैं आसान हेरफेर के लिए XDocument में XDocument लोड करने की कोशिश कर रहा हूं। एक्सएमएल अच्छी तरह से गठित और वैध है (मैं दो बार चेक किया गया)। जब मैं इसे XDocument में कोशिश करता हूं और लोड करता हूं, तो मुझे एक InvalidOperationExceptionXDReader को XDocument में लोड नहीं कर सकता

मिलता है XmlReader स्थिति इस ऑपरेशन के बाद EndOfFile होना चाहिए।

यह लोड करने के लिए कोड

public void ReadXml(System.Xml.XmlReader reader) 
{ 
    var doc = XDocument.Load(reader); 
} 

मैंने XML का नमूना शामिल किया है जो समस्या का कारण बनता है। मैं बिना किसी समस्या के इस वर्ग को क्रमबद्ध और deserialize कर सकते हैं, लेकिन इसे लोड नहीं। कोई विचार?

<?xml version="1.0" encoding="utf-8"?> 
<ForestView xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<Forest> 
<TreeNodeView> 
    <Level>Master</Level> 
    <ID>39476b1f-e2f8-4d76-b82e-a5166899ad43</ID> 
    <Name>Black Mesa</Name> 
    <ServerIPAddress>127.0.0.1</ServerIPAddress> 
    <ServerPortNumber>8000</ServerPortNumber> 
    <ClientIPAddress>NA</ClientIPAddress> 
    <ClientPortNumber>4000</ClientPortNumber> 
    <Nodes> 
    <Level>Server</Level> 
    <NodeID>062c3e03-235d-4d7d-9b60-c6228c9cc89e</NodeID> 
    <Name /> 
    <ServerIPAddress>127.0.0.1</ServerIPAddress> 
    <ServerPortNumber>5000</ServerPortNumber> 
    <ClientIPAddress>127.0.0.1</ClientIPAddress> 
    <ClientPortNumber>4000</ClientPortNumber> 
    </Nodes> 
    <Nodes> 
    <Level>Intermediate</Level> 
    <NodeID>9bafdc9e-771e-42cf-8f03-e7e75a67a6d1</NodeID> 
    <Name>Jen</Name> 
    <ServerIPAddress>127.0.0.1</ServerIPAddress> 
    <ServerPortNumber>8001</ServerPortNumber> 
    <ClientIPAddress>127.0.0.1</ClientIPAddress> 
    <ClientPortNumber>8000</ClientPortNumber> 
    <Nodes> 
     <Level>Terminal</Level> 
     <NodeID>72509141-0ab8-45c1-8042-30afb233b4a8</NodeID> 
     <Name>Mary</Name> 
     <ServerIPAddress>127.0.0.1</ServerIPAddress> 
     <ServerPortNumber>0</ServerPortNumber> 
     <ClientIPAddress>127.0.0.1</ClientIPAddress> 
     <ClientPortNumber>8001</ClientPortNumber> 
    </Nodes> 
    </Nodes> 
    </TreeNodeView> 
</Forest> 
</ForestView> 
+0

इस स्निपेट में कुछ भी गलत नहीं है। क्या आप कोड पोस्ट कर सकते हैं जहां आप XmlReader को तुरंत चालू करते हैं और ReadXml विधि को कॉल करते हैं? –

+0

कृपया कॉल करने वाले कोड को दिखाएं, और पूर्ण अपवाद दिखाएं। –

+0

कृपया उस कोड को भी दिखाएं जिसका उपयोग आप 'XmlReader' बनाने के लिए करते हैं जिसे आप' XDocument.Load' पर पास करते हैं। –

उत्तर

4

यह त्रुटि का तात्पर्य है कि पाठक लोड होने के बाद अतिरिक्त डेटा है जो यह सोचता है कि एक XML दस्तावेज़ है। कृपया सत्यापित करें कि आपकी एक्सएमएल फ़ाइल में अंतिम समापन तत्व के बाद कोई डेटा नहीं है और XmlReader रूट तत्व या फ़ाइल की शुरुआत से पढ़ने के लिए प्रारंभ किया गया है, और कुछ भी नहीं।

35

काफी देर से उत्तर, अगर किसी के पास एक ही समस्या हो रही है। आप, पाठक पर ReadSubtree() का उपयोग करके इसे ठीक कर सकते हैं जैसे:

public void ReadXml(System.Xml.XmlReader reader) 
{ 
    var doc = XDocument.Load(reader.ReadSubtree()); 
} 
0

एक और देर से जवाब है, लेकिन मैं reader.ReadSubtree() वैकल्पिक हल के साथ कोई समस्या हुई थी और यह मेरा स्थिति के लिए काम समाप्त हो गया। मूल दृष्टिकोण एक स्ट्रिंग में पढ़ रहा है, फिर XDocument.Parse():

XDocument doc; 
var textReader = reader as XmlTextReader; 
if (textReader != null) 
{ 
    var xml = textReader.ReadOuterXml(); 
    doc = XDocument.Parse(xml); 
} 
else 
    doc = XDocument.Load(reader); 
+0

यह समाधान मुझे एक त्रुटि देता है: 'यह ऑपरेशन गलत तरीके से संरचित दस्तावेज़ बनाएगा' – mggSoft

+0

आपका एक्सएमएल उस मामले में खराब हो सकता है। – Colin

संबंधित मुद्दे