سؤال

<career code="17-1011.00">
   <code>17-1011.00</code>
   <title>Architects</title>
   <tags bright_outlook="false" green="true" apprenticeship="false" />
   <also_called>
      <title>Architect</title>
      <title>Project Architect</title>
      <title>Project Manager</title>
      <title>Architectural Project Manager</title>
   </also_called>
   <what_they_do>Plan and design structures, such as private residences, office buildings, theaters, factories, and other structural property.</what_they_do>
   <on_the_job>
      <task>Consult with clients to determine functional or spatial requirements of structures.</task>
      <task>Prepare scale drawings.</task>
      <task>Plan layout of project.</task>
   </on_the_job>
</career>

لقد أخذت ملف XML هذا الذي تم إرجاعه من ONet وأرغب في تحليل المعلومات لاستخدامه.هذا هو الكود الذي كتبته لمحاولة تحليل النص الداخلي للعلامات الموجودة ضمن ، مع كون "الإدخال" هو Onet XML.

 XmlDocument inputXML = new XmlDocument();
        inputXML.LoadXml(input);
        XmlElement root = inputXML.DocumentElement;
        XmlNodeList titleList = root.GetElementsByTagName("also_called");
        for (int i = 0; i < titleList.Count; i++)
        {
            Console.WriteLine(titleList[i].InnerText);
        } 

أتوقع NodeList بالحجم الرابع.ولكن عندما أطبع النتيجة، تكون النتيجة بحجم 1:"المهندس المعماريالمهندس المعماريمدير المشروعمدير المشروع المعماري"

هل قمت بإنشاء قائمة عنوان XMLNodeList الخاصة بي بشكل خاطئ؟كيف يمكنني اجتياز شجرة XML ومعالجتها بشكل أكبر للحصول على القيم الداخلية لعلامات "العنوان" ضمن "also_call"؟

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

المحلول

يمكنك الحصول على العناصر المسماة also_called.لا يوجد سوى عنصر واحد من هذا القبيل في قائمتك.ما تريده على الأرجح هو الحصول على أطفال also_called العقدة.

على سبيل المثال:

XmlNodeList also_calledList = root.GetElementsByTagName("also_called");
XmlNode also_calledElement = also_calledList[0];
XmlNodeList titleList = also_calledElement.ChildNodes;

foreach (XmlNode titleNode in titleList)
{
    Console.WriteLine(titleNode.InnerText);
}

ضع في اعتبارك أيضًا استخدام XDocument وLINQ إلى XML بدلاً من XmlDocument - إنه أسهل بكثير في الاستخدام:

XDocument root = XDocument.Parse(input);

foreach (XElement titleNode in root.Descendants("also_called").First().Elements())
{
    Console.WriteLine(titleNode.Value);
}

نصائح أخرى

كل ما تحتاجه هو القليل من XPath.يؤدي هذا إلى تحديد كافة title العقد التي هي أبناء الأول also_called.

        XmlDocument inputXML = new XmlDocument();
        inputXML.LoadXml(input);

        foreach(var node in root.SelectNodes("also_called[1]/title"))
        {
            Console.WriteLine(node.InnerText);
        } 

من النادر أن تحتاج إلى استخدامه GetElementsByTagName أو ChildNodes وأمثالهم و/أو حاول فحص العقدة لمعرفة ما إذا كانت هي العقدة التي تريدها.التنقل في ملف Xml باستخدام XmlDocument هو كل شيء عن استخدام XPath والتي يمكنك من خلالها تحديد الكثير عندما يتعلق الأمر بالحصول على العقد التي تلبي معايير محددة؛سواء من حيث الهيكل داخل الشجرة والمحتوى.

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