سؤال

أنا أعمل في Microsoft Visual C # 2008 Express.

دعنا نقول أن لدي سلسلة ومحتويات السلسلة هي: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

أنا أقول لنفسي أنني أريد أن أفعل شيئا لكلمة "رهيبة" - وربما استدعاء وظيفة تقوم بشيء يسمى "تلوين".

ما هي أفضل طريقة في C # لإجراء اكتشاف أن هذه العلامة موجودة والحصول على هذه السمة؟ لقد عملت القليل مع xelements ومثل في C #، ولكن في الغالب للقيام بالقراءة داخل وخارج ملفات XML.

شكرا!

-adeena.

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

المحلول

حل آخر:

var myString = "This is my <myTag myTagAttrib='colorize'>awesome</myTag> string.";
try
{
    var document = XDocument.Parse("<root>" + myString + "</root>");
    var matches = ((System.Collections.IEnumerable)document.XPathEvaluate("myTag|myTag2")).Cast<XElement>();
    foreach (var element in matches)
    {
        switch (element.Name.ToString())
        {
            case "myTag":
                //do something with myTag like lookup attribute values and call other methods
                break;
            case "myTag2":
                //do something else with myTag2
                break;
        }
    }
}
catch (Exception e)
{
    //string was not not well formed xml
}

أخذت أيضا في الاعتبار تعليقك على dabblernl حيث تريد تحليل سمات متعددة على عناصر متعددة.

نصائح أخرى

يمكنك استخراج XML مع تعبير منتظم، قم بتحميل سلسلة XML المستخرجة في Xelement وتذهب من هناك:

string text=@"This is my<myTag myTagAttrib='colorize'>awesome</myTag> text.";
Match match=Regex.Match(text,@"(<MyTag.*</MyTag>)");
string xml=match.Captures[0].Value;
XElement element=XElement.Parse(xml);
XAttribute attribute=element.Attribute("myTagAttrib");
if(attribute.Value=="colorize") DoSomethingWith(element.Value);// Value=awesome

سيقوم هذا الرمز بإلقاء استثناء إذا لم يتم العثور على عنصر mytag، ولكن يمكن علاجها عن طريق إدخال سطر من:

if(match.Captures.Count!=0)
{...}

يصبح أكثر إثارة للاهتمام إذا كانت السلسلة قد تعقد أكثر من مجرد علامة mytag ...

أنا مرتبك قليلا حول مثالك، لأنك تبديل بين السلسلة (المحتوى النصي)، والعلامات، والسمات. لكنني أعتقد أن ما تريده هو XPath.

لذلك إذا كان دفق XML الخاص بك يشبه هذا:

u003Cadeena/>u003Cparent>u003Cchild x="this is my awesome string">هذه هي سلسلة رهيبة أخرىu003Cchild/>u003Cadeena/>

كنت تستخدم تعبير XPath الذي يشبه هذا للعثور على السمة:

// الطفل / @ x

واحد مثل هذا للعثور على قيمة النص تحت علامة الطفل:

//طفل

أنا مطور جافا، لذلك لا أعرف ما هي مكتبات XML التي تستخدمها للقيام بذلك. ولكن ستحتاج إلى محلل DOM لإنشاء مثيل فئة وثيقة W3C من خلال القراءة في ملف XML ثم استخدام XPath للتفتيش القيم.

هناك جيدة برنامج XPath تعليمي من مدارس W3C إذا إحتجت إلى ذلك.

تحديث:

إذا كنت تقول أن لديك بالفعل دفق XML كسلسلة، فستكون الإجابة غير قراءتها من ملف ولكن من السلسلة نفسها. تحتوي جافا على تجريدات تسمى Inputstream والقارئ التي تتعامل مع تدفقات البايت والأحرف، على التوالي. يمكن أن يكون المصدر ملف، سلسلة، إلخ. تحقق من C # DOM API لمعرفة ما إذا كان لديه شيء مشابه. ستمركز السلسلة إلى المحلل المحلل الذي سيعيد كائن DOM الذي يمكنك التعامل معه.

نظرا لأن الإدخال ليس XML بشكل جيد، فلن تتمكن من تحليله مع أي من مكتبات XML المضمنة. كنت بحاجة إلى تعبير منتظم لاستخراج القطعة المكونة جيدا. ربما يمكنك استخدام واحدة من أكثر من محلل HTML المتفوقين مثل htmlagimespack. على codeplex.

ال XmlTextReader يمكن تحليل شظايا XML مع منشئ خاص الذي مايو مساعدة في هذه الحالة، لكنني لست إيجابيا عن ذلك.

هناك مقالة متعمقة هنا:

http://geelswithblogs.net/kobush/archive/2006/04/20/75717.aspx.

هذا هو حولي لتتناسب مع أي نوع من XML باستخدام Regex:ج # أفضل طريقة للكشف عن XML؟

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