2009-02-09 6 views
6

मेरे पास एक्सएचटीएमएल फाइलों के बड़े बैच हैं जिन्हें मैन्युअल रूप से अपडेट किया गया है। अद्यतनों के समीक्षा चरण के दौरान मैं प्रोग्राम की अच्छी तरह से गठबंधन की जांच करना चाहता हूं। मैं वर्तमान में XmlReader का उपयोग कर रहा हूं, लेकिन औसत CPU पर आवश्यक समय मुझे अपेक्षा से अधिक लंबा है।सी # में एक्सएमएल फाइलों की अच्छी तरह से गठबंधन की जांच करने का सबसे तेज़ तरीका क्या है?

एक्सएचटीएमएल फाइलें 4 केबी से 40 केबी तक आकार में हैं और सत्यापन में प्रति सेकंड कई सेकंड लगते हैं। जांच करना जरूरी है, लेकिन मैं जितना संभव हो सके छोटा समय रखना चाहता हूं क्योंकि चेक को तब किया जाता है जब फाइलें अगले प्रक्रिया चरण में पढ़ी जा रही हैं।

क्या एक साधारण एक्सएमएल अच्छी तरह से गठबंधन जांच करने का कोई तेज़ तरीका है? शायद बाहरी एक्सएमएल पुस्तकालयों का उपयोग कर?


मैं पुष्टि कर सकता है कि मान्य "नियमित" XML आधारित सामग्री बिजली की तेजी XmlReader का उपयोग कर, और के रूप में सुझाव समस्या तथ्य यह है कि एक्सएचटीएमएल DTD हर बार एक फ़ाइल मान्य है पढ़ने के लिए है करने के लिए संबंधित प्रतीत होती है है।

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

ध्यान दें कि DTD के अलावा, इसी .ent फ़ाइलें (एक्सएचटीएमएल-lat1.ent, एक्सएचटीएमएल-symbol.ent, एक्सएचटीएमएल-special.ent) भी डाउनलोड कर रहे हैं। (; तुरंत सत्यापन त्रुटियों जब हम DTD उपेक्षा का परिचय देंगे जैसे, एक & nbsp)

DTD अनदेखी के बाद से पूरी तरह से वास्तव में एक्सएचटीएमएल के लिए एक विकल्प के रूप में अच्छे प्रकार से निर्मित बारीकी से अनुमति के लिए HTML संस्थाओं से जुड़ा हुआ है नहीं है।


समस्या स्थानीय (एम्बेडेड) दोनों DTD और इकाई फ़ाइलों की प्रतियों के साथ के रूप में सुझाव एक कस्टम XmlResolver का उपयोग कर, संयोजन में द्वारा हल किया गया था।

मैं यहाँ समाधान पोस्ट एक बार मैं कोड

+0

मैं एक ऐसी ही समस्या आ रही है। क्या आप इस पर अपना कोड समाधान पोस्ट करना चाहते हैं? – STLDeveloper

+0

@STLDeveloper मैंने निम्नलिखित कोड (VB.NET) में सुझाव लागू किया: [ValidateXMLClass.vb] (https://visualqa.codeplex.com/SourceControl/latest#visualQA/ValidateXMLClass.vb)। आवश्यक .dtd, .ent, और .mod फ़ाइलें (स्थानीय रूप से) स्पीडअप सत्यापन के लिए एम्बेडेड संसाधनों के रूप में शामिल हैं। 'मंद validateFile न्यू ValidateXMLClass validateFile.fileIn = tgtFile रूप तो नहीं validateFile.wellFormed तो ...' के बाद इस तरह के एक लंबे समय के अपने मूल प्रश्न से पारित कर दिया है उपलब्ध कोड बनाने के लिए – barry

+0

धन्यवाद: इस प्रकार कोड कहा जाता है। – STLDeveloper

उत्तर

5

मैं उम्मीद करेंगे कि XmlReaderwhile(reader.Read)() {} साथ होगा सबसे तेजी से कामयाब दृष्टिकोण साफ होगा। यह निश्चित रूप से 4012B पढ़ने के लिए सेकंड नहीं लेना चाहिए ... आप जिस इनपुट दृष्टिकोण का उपयोग कर रहे हैं वह क्या है?

क्या आपके पास शायद कुछ बाहरी (स्कीमा आदि) इकाइयां हल करने के लिए हैं? यदि हां, तो आप एक कस्टम XmlResolver (XmlReaderSettings के माध्यम से सेट) के बजाय एक दूरस्थ लाने स्थानीय रूप से कैश स्कीमा का उपयोग करता है लिखने में सक्षम हो सकती है ...

निम्नलिखित करता है ~ 300KB लगभग तुरन्त:

using(MemoryStream ms = new MemoryStream()) { 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.CloseOutput = false; 
     using (XmlWriter writer = XmlWriter.Create(ms, settings)) 
     { 
      writer.WriteStartElement("xml"); 
      for (int i = 0; i < 15000; i++) 
      { 
       writer.WriteElementString("value", i.ToString()); 
      } 
      writer.WriteEndElement(); 
     } 
     Console.WriteLine(ms.Length + " bytes"); 
     ms.Position = 0; 
     int nodes = 0; 
     Stopwatch watch = Stopwatch.StartNew(); 
     using (XmlReader reader = XmlReader.Create(ms)) 
     { 
      while (reader.Read()) { nodes++; } 
     } 
     watch.Stop(); 
     Console.WriteLine("{0} nodes in {1}ms", nodes, 
      watch.ElapsedMilliseconds); 
    } 
+0

यह मूल रूप से मैं अब उपयोग कर रहा हूं। मैं सीधे फाइलें पढ़ रहा हूं (मैंने उन्हें पहले फ़ाइलस्ट्रीम में पढ़ने की कोशिश की, लेकिन यह ज्यादा नहीं बदलेगा)। मैंने XmlWriterSettings को सेट किया है। FrohibitDtd को गलत। – barry

+0

मुझे एक नज़र डालेंगे और जांच होगी कि समस्या संदर्भित डीटीडी और नेमस्पेस में है या नहीं। – barry

+0

जैसा कि आपने संकेत दिया है कि समस्या एक्सएचटीएमएल डीटीडी प्रतीत होती है। barry

2

बनाएं एक XmlReader ऑब्जेक्ट XmlReaderSettings ऑब्जेक्ट में गुजरकर ऑब्जेक्ट जिसमें ConformanceLevel.Document है।

यह अच्छी तरह से गठबंधन को मान्य करेगा।

यह MSDN article विवरण की व्याख्या करनी चाहिए।

+0

मैंने जोड़ने की कोशिश की ConformanceLevel. सेटिंग्स के लिए दस्तावेज़, लेकिन कोई ध्यान देने योग्य गति वृद्धि नहीं थी। – barry

+0

यह सबसे तेज़ तरीकों में से एक है। जैसा कि मार्क ने बताया है, आपकी गति समस्या किसी अन्य कारण से होने की संभावना है। आप जिस कोड का उपयोग कर रहे हैं उसे शामिल करने के लिए आपको अपनी पोस्ट संपादित करनी चाहिए। – Cerebrus

1

मेरी काफी साधारण लैपटॉप पर, शुरू से ही एक 250K XML दस्तावेज़ पढ़ने में एक XmlReader साथ समाप्त करने के लिए 6 मिलीसेकेंड लेता है। एक्सएमएल को पार्स करने के अलावा कुछ और अपराधी है।

+0

धन्यवाद, इस मुद्दे को सुझाव दिया गया है कि प्रत्येक डीटी के लिए इस्तेमाल किया जा रहा है। – barry

0

जैसा कि अन्य लोगों ने उल्लेख किया है, बाधा सबसे अधिक संभावना XmlReader नहीं है।

जांचें कि क्या आप स्ट्रिंगबिल्डर के बिना बहुत सी स्ट्रिंग कॉन्सटेनेशन नहीं करेंगे।

यह वास्तव में आपके प्रदर्शन को कम कर सकता है।

+0

समस्या डीटीडी में हर चेक को फिर से पढ़ा जा रहा है (जब एक्सएचटीएमएल फाइलों की बजाय नियमित एक्सएमएल फाइलों का उपयोग करते हैं तो चेक अपेक्षा के अनुसार तेजी से चलते हैं)। – barry

0

व्यक्तिगत रूप से, मैं बहुत आलसी हूं ... इसलिए मैं .NET पुस्तकालयों की तलाश करता हूं जो पहले से ही समस्या को हल करते हैं। DataSet.ReadXML() फ़ंक्शन का उपयोग करने का प्रयास करें और अपवादों को पकड़ें। यह XML प्रारूप त्रुटियों को समझाने का एक अद्भुत अद्भुत काम करता है।

1

मैं im necro पोस्टिंग जानते हैं, लेकिन मैं इस एक समाधान

  1. उपयोग एचटीएमएल साफ अपने xml स्पष्ट करने के लिए हो सकता है लगता है। Doctype
  2. को निकालने के लिए विकल्प सेट करें, फिर उत्पन्न से उत्पन्न xhtml/xml पढ़ें।

यहाँ एक ही कोड

public void GetDocumentStructure(int documentID) 
    { 
     string scmRepoPath = ConfigurationManager.AppSettings["SCMRepositoryFolder"]; 
     string docFilePath = scmRepoPath + "\\" + documentID.ToString() + ".xml"; 

     string docFilePath2 = scmRepoPath + "\\" + documentID.ToString() + "_clean.xml"; 

     Tidy tidy = new Tidy(); 
     tidy.Options.MakeClean = true; 
     tidy.Options.NumEntities = true; 
     tidy.Options.Xhtml = true; 
     // this option removes the DTD on the generated output of Tidy 
     tidy.Options.DocType = DocType.Omit; 

     FileStream input = new FileStream(docFilePath, FileMode.Open);    
     MemoryStream output = new MemoryStream(); 
     TidyMessageCollection msgs = new TidyMessageCollection(); 
     tidy.Parse(input, output, msgs);    
     output.Seek(0, SeekOrigin.Begin); 

     XmlReader rd = XmlReader.Create(output);    
     int node = 0; 

     System.Diagnostics.Stopwatch watch = System.Diagnostics.Stopwatch.StartNew(); 
     while (rd.Read()) 
     {     
      ++node;     
     } 
     watch.Stop(); 

     Console.WriteLine("Duration was : " + watch.Elapsed.ToString()); 
    } 
संबंधित मुद्दे

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