2009-08-02 11 views
12

है, मैं log4net UdpAppender से कैप्चर की गई निम्न स्ट्रिंग को पढ़ने का प्रयास कर रहा हूं।एक्सएमएल तत्व का XDocument या XElement पार्सिंग जिसमें नामस्थान

<log4net:event logger="TestingTransmitter.Program" 
       timestamp="2009-08-02T17:50:18.928+01:00" 
       level="ERROR" 
       thread="9" 
       domain="TestingTransmitter.vshost.exe" 
       username="domain\user"> 
    <log4net:message>Log entry 103</log4net:message> 
    <log4net:properties> 
     <log4net:data name="log4net:HostName" value="machine" /> 
    </log4net:properties> 
</log4net:event> 

जब सामग्री XElement.Parse या XDocument.Parse की कोशिश कर रहा है, यह एक अपवाद फेंकता है:

'log4net' एक अघोषित नाम स्थान है। लाइन 1, स्थिति 2.

मैं जानता हूँ कि मैं खोज और जगह ले सकता है "log4net:" मूल स्ट्रिंग में और इसे हटाने, मुझे XML सफलतापूर्वक पार्स करने के लिए अनुमति देता है, लेकिन वहाँ एक बेहतर तरीका है? , एक्सएमएल से यह पूरा डेटा पर कब्जा कर लिया (पढ़ने की अनुमति के लिए पुन: स्वरूपित) है वहाँ कोई एक्सएमएल नाम स्थान बनाया है या हटा दिया घोषणाओं हैं ..

उत्तर

18

सबसे पहले, XmlNamespaceManager क्लास का एक उदाहरण बनाएं, और उसमें अपना नामस्थान जोड़ें, उदा।

XmlNamespaceManager mngr = new XmlNamespaceManager(new NameTable()); 
    mngr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
    mngr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); 

उन नाम स्थान मैपिंग का उपयोग कर एक XML स्ट्रिंग पार्स करने के लिए, निम्न फ़ंक्शन को कॉल नामस्थान आप इसे शामिल कर लिया है साथ XmlNamespaceManager के कहने गुजर:

/// <summary>Same as XElement.Parse(), but supports XML namespaces.</summary> 
/// <param name="strXml">A String that contains XML.</param> 
/// <param name="mngr">The XmlNamespaceManager to use for looking up namespace information.</param> 
/// <returns>An XElement populated from the string that contains XML.</returns> 
public static XElement ParseElement(string strXml, XmlNamespaceManager mngr) 
{ 
    XmlParserContext parserContext = new XmlParserContext(null, mngr, null, XmlSpace.None); 
    XmlTextReader txtReader = new XmlTextReader(strXml, XmlNodeType.Element, parserContext); 
    return XElement.Load(txtReader); 
} 
+0

-1 'नया XmlTextReader() 'का उपयोग करने के लिए, .NET 2.0 के बाद से हटा दिया गया। –

+1

@ जॉन सैंडर्स आपने इसे कहाँ देखा? यह बहिष्कृत नहीं दिखता है: http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader(v=vs.110).aspx – georgiosd

+0

FYI, आपको 'new XmlTextReader()' या 'नया XmlTextWriter()'। उन्हें .NET 2.0 के बाद से हटा दिया गया है। 'XmlReader.Create()' या 'XmlWriter.Create()' का उपयोग करें। –

11

आप वास्तव में केवल दो विकल्प हैं::

  1. पट्टी "log4net" जैसा आपने सुझाव दिया;
  2. एक्सएमएल को नेमस्पेस घोषित करने के लिए संशोधित करें, संभवतया घोषणा के रूट तत्व में खंड (स्ट्रिंगबिल्डर के माध्यम से) को लपेटकर आसानी से पूरा किया जा सकता है।

कड़ाई से बोलते हुए, आपका उदाहरण विकृत एक्सएमएल है - इसमें कोई आश्चर्य नहीं है कि XDocument/XElement इसे पार्स नहीं करेगा।

-1

आप ऐसा ही कुछ का उपयोग कर सकते :

<event xmlns="http://..." > 
    <message xmlns="http://...">...</message> 
</event> 
संबंधित मुद्दे