2010-10-20 16 views
7

मैं कुछ मानक XML दस्तावेज़ों को पार्स करने का प्रयास कर रहा हूं जो विभिन्न स्रोतों से MARCXML नामक स्कीमा का उपयोग करते हैं।मनमानी नामस्थानों के साथ एक XML दस्तावेज़ को सही तरीके से कैसे पार्स करें

यहाँ एक उदाहरण एक्सएमएल फ़ाइल संभाला जाना चाहिए की पहली कुछ पंक्तियों रहे हैं ...

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"> 
    <marc:record> 
    <marc:leader>00925njm 22002777a 4500</marc:leader> 

और नामस्थान उपसर्ग के बिना एक ...

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<collection xmlns="http://www.loc.gov/MARC21/slim"> 
    <record> 
    <leader>01142cam 2200301 a 4500</leader> 

कुंजी बिंदु: प्रोग्राम में आगे बढ़ने के लिए XPaths को प्राप्त करने के लिए मुझे नामस्थान में नेमस्पेस जोड़ने के लिए रेगेक्स रूटीन से गुज़रना होगा (जो उन्हें डिफ़ॉल्ट रूप से नहीं जोड़ता है)। यह मेरे लिए अनावश्यक लगता है।

Regex xmlNamespace = new Regex("xmlns:(?<PREFIX>[^=]+)=\"(?<URI>[^\"]+)\"", RegexOptions.Compiled); 

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xmlRecord); 
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable); 

MatchCollection namespaces = xmlNamespace.Matches(xmlRecord); 
foreach (Match n in namespaces) 
{ 
    nsMgr.AddNamespace(n.Groups["PREFIX"].ToString(), n.Groups["URI"].ToString()); 
} 

XPath कॉल कुछ इस तरह दिखता ...

XmlNode leaderNode = xmlDoc.SelectSingleNode(".//" + LeaderNode, nsMgr);

कहाँ LeaderNode एक विन्यास मूल्य है और दूसरे उदाहरण में पहले उदाहरण में "marc:leader" और "leader" बराबर होगा।

क्या ऐसा करने के लिए एक बेहतर, अधिक प्रभावी तरीका है? नोट: LINQ का उपयोग करके इसे हल करने के सुझावों का स्वागत है, लेकिन मैं मुख्य रूप से यह जानना चाहता हूं कि XmlDocument का उपयोग करके इसे कैसे हल किया जाए।

संपादित करें: मैं GrayWizardx की सलाह मान ली और अब निम्नलिखित कोड है ...

if (LeaderNode.Contains(":")) 
{ 
    string prefix = LeaderNode.Substring(0, LeaderNode.IndexOf(':')); 
    XmlNode root = xmlDoc.FirstChild; 
    string nameSpace = root.GetNamespaceOfPrefix(prefix); 
    nsMgr.AddNamespace(prefix, nameSpace); 
} 

अब Regex पर कोई और अधिक निर्भरता है!

+0

मुझे लगभग एक ही समस्या का सामना करना पड़ रहा है। आप अपने 'लीडर नोड' जादू को कैसे पूरा करते हैं? क्या आपको पता है कि आप किस रिकॉर्ड प्रकार से निपट रहे हैं? –

उत्तर

2

यदि आप जानते हैं दस्तावेज़ में एक तत्व दिया गया है (उदाहरण के लिए मूल तत्व) तो आप GetNamespaceOfPrefix का उपयोग करने का प्रयास कर सकते हैं।

+0

यह आशाजनक लग रहा है। मैं इसे आज़मा दूंगा :) –

+0

जिस तरह से मैं नामस्थान समझता हूं, उन्हें दस्तावेज़ में कहीं भी घोषित किया जा सकता है। क्या आप इस सामान्य मामले से निपटने के लिए पर्याप्त रूप से इस विधि को सार कर सकते हैं? –

+0

@ पैट्रिक एम मैं ईमानदार होने के लिए निश्चित नहीं हूँ। मेरी समझ यह थी कि उन्हें दस्तावेज़ के मूल तत्व पर परिभाषित किया जाना था, लेकिन शायद किसी भी मूल तत्व में जोड़ा जा सकता है। मैंने थोड़ी देर के लिए इसे देखा है। – GrayWizardx

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