XDocument को पार्स करते समय शून्य XElements को संभालना - सी #, एक्सएमएल, त्रुटि-हैंडलिंग, linq-to-xml

इस तरह कुछ करने का एक बेहतर तरीका है:

private XElement GetSafeElem(XElement elem, string key)
{
XElement safeElem = elem.Element(key);
return safeElem ?? new XElement(key);
}

private string GetAttributeValue(XAttribute attrib)
{
return attrib == null ? "N/A" : attrib.Value;
}

var elem = GetSafeElem(elem, "hdhdhddh");
string foo = GetAttributeValue(e.Attribute("fkfkf"));

//attribute now has a fallback value

XML दस्तावेज़ से तत्व / विशेषता मानों को पार्स करते समय? कुछ मामलों में तत्व कुछ ऐसा करने पर नहीं पाया जा सकता है:

string foo (string)elem.Element("fooelement").Attribute("fooattribute").Value

तो एक ऑब्जेक्ट संदर्भ त्रुटि उत्पन्न होगी (माना जाता है कि तत्व / विशेषता नहीं मिली है)। तत्व मान तक पहुंचने का प्रयास करते समय

उत्तर:

जवाब के लिए 2 № 1

सुनिश्चित नहीं है कि यह एक बेहतर दृष्टिकोण है, लेकिन मैंने इसे कोडप्रोजेक्ट पोस्ट में देखा और सोचा कि यह यहां एक उपयोगी दृष्टिकोण हो सकता है।

"विधि" एक्सटेंशन विधि का उपयोग करके इसका एक monadic समाधान है:

public static TResult With<TInput, TResult>(this TInput o,
Func<TInput, TResult> evaluator)
where TResult : class where TInput : class
{
if (o == null) return null;
return evaluator(o);
}

और एक वापसी विस्तार विधि:

public static TResult Return<TInput,TResult>(this TInput o,
Func<TInput, TResult> evaluator, TResult failureValue) where TInput: class
{
if (o == null) return failureValue;
return evaluator(o);
}

और उन्हें एक साथ जोड़कर आपकी क्वेरी इस तरह दिख सकती है:

var myElement = element.With(x => x.Element("FooElement")).Return(x => x.Attribute("FooAttribute").Value, "MyDefaultValue")

निश्चित रूप से पिछले पोस्ट में सुझाए गए सरल एक्सटेंशन विधियों का उपयोग करने से इसकी सुंदरता सुनिश्चित नहीं है, लेकिन यह थोड़ा और सामान्य है और यह एक अच्छा दृष्टिकोण है IMO

कोडप्रोजेक्ट - चेन नल चेक और शायद मोनड


जवाब के लिए 5 № 2

मैं सिर्फ विस्तार विधियों का उपयोग करूंगा। यह वही बात है, लेकिन यह सुंदर है:

public static XElement SafeElement(this XElement element, XName name)
{
return element.Element(name) ?? new XElement(name);
}

public static XAttribute SafeAttribute(this XElement element, XName name)
{
return element.Attribute(name) ?? new XAttribute(name, string.Empty);
}

फिर आप कर सकते हैं:

string foo = element.SafeElement("fooelement").SafeAttribute("fooattribute").Value;

उत्तर № 3 के लिए 1

सी # 6.0 में आप मोनैडिक नल-सशर्त ऑपरेटर का उपयोग कर सकते हैं ?. इसे अपने उदाहरण में लागू करने के बाद यह इस तरह दिखेगा:

string foo = elem.Element("fooelement")?.Attribute("fooattribute")?.Value;

अगर fooelement या fooattribute मौजूद नहीं है तो पूरी अभिव्यक्ति नतीजा होगी। आप और पढ़ सकते हैं यहाँ नल-सशर्त ऑपरेटर शीर्षक वाले हिस्से में।


जवाब के लिए 0 № 4

इस तरह से प्रयास करें;

public static string TryGetElementValue(this XElement parentEl, string elementName, string defaultValue = null)
{
var foundEl = parentEl.Element(elementName);
if(foundEl != null)
{
return foundEl.Value;
}
else
{
return defaultValue;
}
}

और उसके बाद कोड बदलें:

select new News()
{
id = noticia.TryGetElementValue("IdNoticia"),
published = noticia.TryGetElementValue("Data"),
title = noticia.TryGetElementValue("Titol"),
subtitle = noticia.TryGetElementValue("Subtitol"),
thumbnail = noticia.TryGetElementValue("Thumbnail", "http://server/images/empty.png")
};

संबंधित सवाल
सबसे लोकप्रिय