سؤال

كيف يمكنك إجراء قراءة متدفقة على ملف XML كبير يحتوي على تسلسل xs أسفل العنصر الجذر مباشرة، دون تحميل الملف بأكمله في مثيل XDocument في الذاكرة؟

هل كانت مفيدة؟

المحلول

الذهاب مع محلل عنصر نمط SAX و XmlTextReader فئة تم إنشاؤها باستخدام XmlReader.إنشاء ستكون فكرة جيدة، نعم.فيما يلي مثال للتعليمات البرمجية المعدلة قليلاً من CodeGuru:

void ParseURL(string strUrl)
{
  try
  {
    using (var reader = XmlReader.Create(strUrl))
    {
      while (reader.Read())
      {
        switch (reader.NodeType)
        {
          case XmlNodeType.Element:
            var attributes = new Hashtable();
            var strURI = reader.NamespaceURI;
            var strName = reader.Name;
            if (reader.HasAttributes)
            {
              for (int i = 0; i < reader.AttributeCount; i++)
              {
                reader.MoveToAttribute(i);
                attributes.Add(reader.Name,reader.Value);
              }
            }
            StartElement(strURI,strName,strName,attributes);
            break;
            //
            //you can handle other cases here
            //
            //case XmlNodeType.EndElement:
            // Todo
            //case XmlNodeType.Text:
            // Todo
            default:
            break;
          }
        }
      }
      catch (XmlException e)
      {
        Console.WriteLine("error occured: " + e.Message);
      }
    }
  }
}

نصائح أخرى

لا يمكنني إضافة تعليق، لأنني قمت بالتسجيل للتو ولكن نموذج التعليمات البرمجية الذي نشرته Hirvox والمحدد حاليًا كإجابة به خطأ.لا ينبغي أن يكون new بيان عند استخدام ثابت Create طريقة.

حاضِر:

using (var reader = new XmlReader.Create(strUrl))

مُثَبَّت:

using (var reader = XmlReader.Create(strUrl))

أعتقد أنه ليس من الممكن إذا كنت تريد استخدام نموذج الكائن (على سبيل المثال.XElement\XDocument) للاستعلام عن XML.من الواضح أنه لا يمكنك إنشاء شجرة كائنات XML دون قراءة بيانات كافية.ومع ذلك يمكنك استخدام XmlReader فصل.

تقرأ فئة XMLReader بيانات XML من دفق أو ملف.إنه يوفر الوصول غير المقيد ، والاتاصل فقط ، والقراءة فقط إلى بيانات XML.

هنا هو كيف: http://support.microsoft.com/kb/301228/en-us فقط تذكر أنه لا ينبغي عليك استخدام XmlTextReader بل بدلاً من ذلك XmlReader بالتزامن مع XmlReader.Create

أنا في حيرة من أمري عند ذكر "xs:sequence" - هذا عنصر مخطط XML.

هل تحاول فتح ملف مخطط XML كبير؟هل تفتح ملف XML كبيرًا يعتمد على هذا المخطط؟أم أنك تحاول فتح ملف XML كبير والتحقق من صحته في نفس الوقت؟

لا ينبغي أن توفر لك أي من هذه المواقف مشكلة في استخدام XmlReader القياسي (أو XmlValidatingReader).

قراءة XML باستخدام XMLReader: http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx

يحاول نموذج التعليمات البرمجية هذا تحويل رمز نمط XmlReader إلى رمز نمط SAX - إذا كنت تكتب رمزًا من البداية فسأستخدم XmlReader كما هو مقصود - اسحب وليس ادفع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top