يتم اقتطاع ملفات Xml الكبيرة بواسطة MSXML4 / FreeThreadedDOMDocument40 (مشكلة التشغيل المتداخل لسلسلة COM)

StackOverflow https://stackoverflow.com/questions/1612619

  •  06-07-2019
  •  | 
  •  

سؤال

أنا أستخدم الكود التالي لتحميل مستند Xml كبير (حوالي 5 ميجابايت):

int _tmain(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);

    HRESULT hr;
    CComPtr< IXMLDOMDocument > spXmlDocument;
    hr = spXmlDocument.CoCreateInstance(__uuidof(FreeThreadedDOMDocument60)), __uuidof(FreeThreadedDOMDocument60);
    if(FAILED(hr)) return FALSE;

    spXmlDocument->put_preserveWhiteSpace(VARIANT_TRUE);
    spXmlDocument->put_async(VARIANT_FALSE);
    spXmlDocument->put_validateOnParse(VARIANT_FALSE);

    VARIANT_BOOL bLoadSucceeded = VARIANT_FALSE;
    hr = spXmlDocument->load( CComVariant( L"C:\\XMLFile1.xml" ), &bLoadSucceeded );

    if(FAILED(hr) || bLoadSucceeded==VARIANT_FALSE) return FALSE;

    CComVariant bstrDoc;
    hr = spXmlDocument->get_nodeValue(&bstrDoc);

    CComPtr< IXMLDOMNode > spNode;
    hr = spXmlDocument->selectSingleNode(CComBSTR(L"//SpecialNode"), &spNode );
}

أجد أن محتويات bstrDoc مقطوعة (لا توجد استثناءات/نتائج HR فاشلة)

هل يعرف أحد لماذا؟يمكنك تجربة ذلك بنفسك فقط عن طريق إنشاء ملف Xml كبير الحجم فقط <xml></xml> العناصر (حوالي 5 ميغابايت يجب أن تفعل ذلك)

تحديث: لم يُحدِث التحديث لاستخدام MSXML 6 أي فرق، كما لم يُحدِث تعيين Async على false واستخدام get_nodeValue / get_text أي فرق (تم تحديث النموذج)

لقد لاحظت أنه إذا قمت بتحديدSingleNode لعقدة موضوعة في نهاية المستند، فإن الأمر يعمل بشكل جيد - يبدو أن المستند يتم تحميله بنجاح، والمشكلة تكمن بدلاً من ذلك في الحصول على النص لعقدة واحدة.أنا في حيرة من أمري ولكنني لم أجد بعد أي شخص آخر على الإنترنت يعاني من هذه المشكلة.

التحديث 2: يبدو أن المشكلة مرتبطة بـ COM interop نفسه - لقد قمت بإنشاء فئة C# بسيطة تقوم بنفس الشيء وعرضتها ككائن COM.أستطيع أن أرى أنه على الرغم من أن Xml جيد في تطبيق C# الخاص بي، إلا أنه بحلول الوقت الذي أنظر إليه في مصحح الأخطاء الخاص بي في تطبيق C++، فإنه يبدو تمامًا كما كان عند استخدام MSXML.

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

المحلول

يبدو أنني كنت ضحية لحماقتي - لم يتم في الواقع اقتطاع Xml/السلاسل، وكان المشاهد في Visual Studio يكذب عليّ بكل بساطة.

أظهر إخراج السلاسل إلى ملف أن السلاسل كانت كلها كما ينبغي.

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