हमारे पास एक स्ट्रिंग फ़ील्ड है जिसमें XML या सादा पाठ हो सकता है। एक्सएमएल में <?xml
हेडर नहीं है, और कोई मूल तत्व नहीं है, यानी अच्छी तरह से गठित नहीं है।कैसे बताएं कि स्ट्रिंग xml है या नहीं?
हमें एक्सएमएल डेटा को रेडक्ट करने, एलिमेंटिंग तत्व और एट्रिब्यूट वैल्यू को खाली करने में सक्षम होना चाहिए, केवल उनके नाम छोड़कर, इसलिए मुझे यह जांचने की आवश्यकता है कि यह स्ट्रिंग फिर से एक्सएमएल है या नहीं।
string redact(string eventDetail)
{
string detail = eventDetail.Trim();
if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
...
वहाँ एक बेहतर तरीका है:
वर्तमान में मैं इस दृष्टिकोण का उपयोग कर रहा हूँ?
क्या इस दृष्टिकोण से कोई बढ़िया मामला याद आ सकता है?
मुझे सराहना है कि मैं XmlDocument.LoadXml
का उपयोग कर सकता हूं और XmlException
पकड़ सकता हूं, लेकिन यह एक महंगा विकल्प जैसा लगता है, क्योंकि मुझे पहले से ही पता है कि बहुत सारे डेटा एक्सएमएल में नहीं होंगे।
यहाँ XML डेटा का एक उदाहरण है, के अलावा एक मूल तत्व (जो, स्थान बचाने के लिए के बाद से वहाँ डेटा का एक बहुत हो जाएगा छोड़ दिया जाता है) याद आ रही से, हम यह मान सकते हैं कि यह अच्छी तरह से बनाई है:
<TableName FirstField="Foo" SecondField="Bar" />
<TableName FirstField="Foo" SecondField="Bar" />
...
वर्तमान में हम केवल विशेषता आधारित मानों का उपयोग कर रहे हैं, लेकिन यदि डेटा अधिक जटिल हो जाता है तो हम भविष्य में तत्वों का उपयोग कर सकते हैं।
समाधान
अनेक टिप्पणियाँ के आधार पर (धन्यवाद लोग!)
string redact(string eventDetail)
{
if (string.IsNullOrEmpty(eventDetail)) return eventDetail; //+1 for unit tests :)
string detail = eventDetail.Trim();
if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
XmlDocument xml = new XmlDocument();
try
{
xml.LoadXml(string.Format("<Root>{0}</Root>", detail));
}
catch (XmlException e)
{
log.WarnFormat("Data NOT redacted. Caught {0} loading eventDetail {1}", e.Message, eventDetail);
return eventDetail;
}
... // redact
मैं लोडएक्सएमएल के साथ जाऊंगा, इस तरह आप इनपुट किए गए "एक्सएमएल" डेटा को मान्य मानते हैं। यदि आप अपनी विधि (कोड) का उपयोग करते हैं, तो आप XML को खराब कर सकते हैं जो परीक्षण पास करेगा। – Martin
देखें http://stackoverflow.com/questions/1072158/validate-xml-syntax-only-in-c – Graviton
क्या आप इसे स्वयं लिख रहे हैं? मुझे समझ में नहीं आता है कि आप इसे इस तरह लिख रहे हैं कि आप सही तरीके से क्षेत्रों की व्याख्या नहीं कर सकते हैं, फिर ...? –