-3

I have tried many way to read the value A180 in <p name="conDN">A180</p>, but fail.

I would like to read all values for the below name:

  • class, grade, id
  • conDN, Code, product, serial

Attribute Name = name;
Attribute value = conDN;
i really no idea how to call A180
** I am newbie in C#.**

May the expert guide me on how to read it.

Thank you very much.

Below is the XML content:

<Subject class="High" grade="E21" id="78038751482">
  <p name="conDN">A180</p>
  <p name="Code">AA98073512</p>
  <p name="product">ACN5677</p>
  <p name="serial">AEXB18201</p>
</Subject>
<Subject class="Low" grade="E21" id="98721124">
  <p name="conDN">B900</p>
  <p name="Code">BA723512</p>
  <p name="product">BG5677</p>
  <p name="serial">BCB18148</p>
</Subject>
<Subject class="Middle" grade="E2022" id="52358523205">
  <p name="conDN">C800</p>
  <p name="Code">CA47351299</p>
  <p name="product">CA5677</p>
  <p name="serial">CTB18201</p>
</Subject>

Please find below is my code:

string attName = null;
string attValue = null;
do
{

    reader.MoveToFirstAttribute();

    attName = "class";
    if (reader.MoveToAttribute(attName))
        attValue = reader.ReadContentAsString();
    tbox01.AppendText($"{attName} : {attValue} \n");

    attName = "grade";
    if (reader.MoveToAttribute(attName))
        attValue = reader.ReadContentAsString();
    tbox01.AppendText($"{attName} : {attValue} \n");

    attName = "id";
    if (reader.MoveToAttribute(attName))
        attValue = reader.ReadContentAsString();
    tbox01.AppendText($"{attName} : {attValue} \n");


    //------------ Read Element --------------

    reader.ReadToFollowing("p");
    attName = "name";
    if (reader.MoveToAttribute(attName))
        attValue = reader.ReadContentAsString();
    tbox01.AppendText($"{attName} : {attValue} \n");


    tbox01.AppendText("-------------------------");
        tbox01.AppendText(Environment.NewLine);


} while (reader.ReadToFollowing("Subject") );

Below is what i get with my code:

class : High 
grade : E21 
id : 78038751482 
name : conDN 
-------------------------
class : Low 
grade : E21 
id : 98721124 
name : conDN 
-------------------------
class : Middle 
grade : E2022 
id : 52358523205 
name : conDN 
-------------------------
------------ END -------------
ghee148
  • 3
  • 2

1 Answers1

0

With huge xml files I use combination of XML Reader and XML Linq

using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Linq;



namespace ConsoleApp2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";   
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);

            while(!reader.EOF)
            {
                if (reader.Name != "Subject")
                {
                    reader.ReadToFollowing("Subject");
                }
                if(!reader.EOF)
                {
                    XElement subject = (XElement)XElement.ReadFrom(reader);
                    string _class = (string)subject.Attribute("class");
                    string grade = (string)subject.Attribute("grade");
                    string id = (string)subject.Attribute("id");
                    string conDN = (string)subject.Elements().Where(x => (string)x.Attribute("name") == "conDN").FirstOrDefault();
                    string code = (string)subject.Elements().Where(x => (string)x.Attribute("name") == "Code").FirstOrDefault();
                    string product = (string)subject.Elements().Where(x => (string)x.Attribute("name") == "product").FirstOrDefault());
                    string serial = (string)subject.Elements().Where(x => (string)x.Attribute("name") == "serial").FirstOrDefault();

                    Console.WriteLine("class = {0}, grade = {1}, id = {2}, conDN = {3}, code = {4}, product = {5}, serial = {6}", 
                        _class, grade, id, conDN, code, product, serial);
                }
            }
            Console.ReadLine();
 
        }
    }
}
jdweng
  • 33,250
  • 2
  • 15
  • 20
  • Dear @jdweng, it is working well. thank you very much. I had tried to solve it for 1 month. Highly appreciate your assistance. Now I know I was missing using System.Xml.Linq;, so i always get error when using XElement. Thank you again for your big help. – ghee148 Sep 25 '22 at 13:36
  • Huge XML you always have to use XML Reader. – jdweng Sep 25 '22 at 13:45
  • Dear @jdweng, with below, if cannot find element Code, can I skip this when get error? string code = (string)subject.Elements().Where(x => (string)x.Attribute("name") == "Code").First(); – ghee148 Jan 10 '23 at 03:33
  • I changed First() to FirstOrDefault() which will stop the error from occurring. – jdweng Jan 10 '23 at 09:44