كيف يمكنني إزالة العقد الفرعية مع الاحتفاظ بالقيمة؟


مرحبًا!

لدي عنصر في XML الخاص بي كما يلي:

<p>This is a paragraph. < b >This is a bold tag.< /b > < b >This is another bold tag.< /b > < i >This is an italic tag.< /i ></p>.

يجب أن يكون الإخراج الخاص بي:

<p>This is a paragraph. This is a bold tag. This is another bold tag. This is an italic tag.</p>

الإخراج الذي أحصل عليه:

<p>This is a paragraph.This is a bold tag.This is another bold tag.This is an italic tag.</p>

جميع القيم في الداخل

العلامات متسلسلة والمسافة الموجودة في نهاية العلامات مفقودة.

هل هناك أي طريقة لإزالة العقد الداخلية والاحتفاظ بالقيم مع المسافات؟ أم أن هناك طريقة لمنع هذا التسلسل بدون مسافات؟

أريد أن تكون القيم كما هي في ملف XML الرئيسي.

الرجاء المساعدة.

يعتبر
رجل

ما حاولت:

ج#
XDocument xdoc = XDocument.Load("XMLFile.xml");
.
.
.
xdoc.Element("p").Value;

لقد كتبت للتو الكود حيث أحصل على القيمة. من فضلك قل لي ما هي التغييرات التي أحتاج إلى إجرائها هنا للقيم كما هو مطلوب في السؤال.

الحل 1

بافتراض أن إدخالك هو XML صالح (على عكس المثال الذي قدمته)، يمكن القيام بذلك باستخدام الكود التالي:

XDocument doc = XDocument.Parse(
    "<p>This is a paragraph. <b>This is a bold tag.</b> <b>This is another bold tag.</b> <i>This is an italic tag.</i></p>",
    LoadOptions.PreserveWhitespace
);
		
string valueWithoutXmlElements = doc.Root.Value;
doc.Root.SetValue(valueWithoutXmlElements);
		
string valueWithRootXmlElement = doc.Root.ToString();
		
Console.WriteLine(valueWithRootXmlElement);

على وجه التحديد اضطررت إلى إزالة المسافات داخل أسماء العلامات (لذلك بدلاً من إلخ). لقد قمت أيضًا بإزالة علامات الترقيم الزائدة لأن XML لا يمكن أن يحتوي على نص خارج العقدة الجذرية. إذا كان عليك دعم XML غير صالح، فلن تتمكن من معالجته بأي شيء باستخدام بناء جملة XML مناسب (XmlReader، XDocument، XmlDocument، …)، ولكن سيتعين عليك استخدام تعبيرات عادية أو ما شابه ذلك كما تم اقتراحه بالفعل.

الخدعة الرئيسية التي كنت تفتقدها هي العلم:

LoadOptions.PreserveWhitespace

يؤدي هذا إلى توجيه محلل XML للاحتفاظ بالمسافات البيضاء فقط للعقد النصية (وبالتالي يتم الاحتفاظ دائمًا بالمسافات بين علامات عناصر XML – المسافات داخل النص وحوله).

تحديث القيمة “مع نفسها”، ثم الحصول على XML عن طريق استدعاء ToString() يبدو قبيحًا بعض الشيء، ولكنه سيحصل على النتيجة التي تريدها دون القيام بأي معالجة للعقدة بنفسك.

أستخدم XDocument.Parse للاحتفاظ بالمثال في ملف واحد – يمكنك أيضًا تحديد LoadOptions عند استخدام XDocument.Load.

コメント

タイトルとURLをコピーしました