Link to home
Start Free TrialLog in
Avatar of rwheeler23
rwheeler23Flag for United States of America

asked on

Non-Alphanumeric tag values coming back as blanks. How do I retrieve these values?

I have this snippet of code that reads an xml file. All works well with one exception. If any of the elements with a tag have something other than [0-9] or [A-Z] the value comes back as blank.   One of the elements has a dash, ('-'), in it so those names all come back blank. I see the same thing with parentheses, left '(' or right ')' plus quotation marks will cause this. Is there any way to correct this? I cannot change the values inside the xml file.

       private void btnExtract_Click(object sender, EventArgs e)
        {

            TextWriter tw = new StreamWriter(OutputFilename);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(InputFilename);


            if (xml.LastChild.Attributes != null)
            {
                foreach (XmlAttribute prop in xml.LastChild.Attributes)
                {
                    switch (prop.Name)
                    {
                        case "PhysicalName":
                            OPhysicaladdress = prop.Value;
                            break;

                        case "OResident":
                            OResident = prop.Value;
                            break;
                        case "data_source":
                            ODatasource = prop.Value;
                            break;
                        case "name":
                            OName = prop.Value;
                            break;
                    }
                }
            }
            else
            {
                Console.WriteLine("Xml object is empty");
            }

            FinalObject obj = new FinalObject
            {
                Name = OName,
                PhysicalAddress = OPhysicaladdress,
                DataSource = ODatasource,
                Resident = OResident
            };

            tw.WriteLine(obj.PhysicalAddress, obj.DataSource, obj.Name);
            /* System.IO.File.WriteAllLines(OutputFilename, FinalObject); */
        }

I have attached the source file.
DataSources_out.xml
Avatar of slightwv (䄆 Netminder)
slightwv (䄆 Netminder)

The attachment looks like the output?
Avatar of rwheeler23

ASKER

My mistake, too many distractions. I have attached the input file.. I am trying to extract these three elements.

Physical Name
Database
Name

When any of these three contain anything other than [0-9] or [A-Z] the value returned is blank.
DataSources.xml
I just tested the code I provided from your previous question and added parans to a name and I get data:
https://dotnetfiddle.net/uSlqhR

You didn't post enough of your code to set up a test case but I went back to your previous question and the code there and also added parans:
https://dotnetfiddle.net/1ykVTf

I don't see from that question where the example using LastChild.Attributes worked.

If you can post a sqlfiddle of using my XML example and your code, I'll take a look at it.
I will get back on this Wednesday and will let you know.  This is one of a dozen projects I am working on so it is difficult to focus on just one. I also need to learn how to use SQLFiddle.
>>I also need to learn how to use SQLFiddle.

That is also a pretty good site to test things out but just to clarify:  sqlfiddle and dotnetfiddle that I posted are different.
Looks like on both you can paste your code and see it in action. I can only assume there are some unique debugging tools on both of these sites.
>>Looks like on both you can paste your code and see it in action.

Correct.  They allow you to test can more important, share examples with others so everyone sees the same thing.

>>I can only assume there are some unique debugging tools on both of these sites.

No more than available elsewhere.
Inserting your suggestions does not appear to have made any difference. Am I missing something?
       
 private void btnExtract_Click(object sender, EventArgs e)
        {

            TextWriter tw = new StreamWriter(OutputFilename);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(InputFilename);

            XmlNodeList xnList = xml.SelectNodes("/Application/DataSourceRepository/DataObjects/DataObject");

            if (xnList != null)
            foreach (XmlNode LastChild in xnList) {
                if (xml.LastChild.Attributes != null)
                {
                    foreach (XmlAttribute prop in xml.LastChild.Attributes)
                    {
                        switch (prop.Name)
                        {
                            case "PhysicalName":
                                OPhysicaladdress = prop.Value;
                                break;

                            case "OResident":
                                OResident = prop.Value;
                                break;
                            case "data_source":
                                ODatasource = prop.Value;
                                break;
                            case "name":
                                OName = prop.Value;
                                break;
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("Xml object is empty");
            }

            FinalObject obj = new FinalObject
            {
                Name = OName,
                PhysicalAddress = OPhysicaladdress,
                DataSource = ODatasource,
                Resident = OResident
            };

            tw.WriteLine(obj.PhysicalAddress, obj.DataSource, obj.Name);
            /* System.IO.File.WriteAllLines(OutputFilename, FinalObject); */
        }
DataSources_out.xml
>>Inserting your suggestions does not appear to have made any difference. Am I missing something?

I'm not sure.  I don't have access to your system to test code on it.

If you provide me a Fiddle that shows the problem, I can correct it.

If you provide me the stand-alone code for a console app that I can copy/past/compile on my machine, I can correct it.

Trying to debug coded I cannot run is pretty much impossible,
Here is the complete project
ExtractObjectNames.zip
I need to state a correction. Clicking the button XML Sample results in this error message:

"Data at the root level is invalid. Line 1., Position 1."

This is code you have provided assistance.
>>Clicking the button XML Sample results

What button?

>>Here is the complete project

I don't have Visual Studio.  I don't want the entire project.   Create a new one that is a console app.  That I should be able to compile with the command line to create an exe.

That said:  I looked at frmXMLExtractObjectNames.cs and don't see the code you posted.  What file should I be looking in?
This the code that fails whenever there is a -,(,) etc.  If you look at the output file notice how name=POWMATQP in the beginning but goes to blank for the rest. That is because the database name is GP-POWMAT. The - is causing this.

private void btnExtract_Click(object sender, EventArgs e)
        {

            TextWriter tw = new StreamWriter(OutputFilename);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(InputFilename);

            XmlNodeList xnList = xml.SelectNodes("/Application/DataSourceRepository/DataObjects/DataObject");

            if (xnList != null)
            foreach (XmlNode LastChild in xnList) {
                if (xml.LastChild.Attributes != null)
                {
                    foreach (XmlAttribute prop in xml.LastChild.Attributes)
                    {
                        switch (prop.Name)
                        {
                            case "PhysicalName":
                                OPhysicaladdress = prop.Value;
                                break;

                            case "OResident":
                                OResident = prop.Value;
                                break;
                            case "data_source":
                                ODatasource = prop.Value;
                                break;
                            case "name":
                                OName = prop.Value;
                                break;
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("Xml object is empty");
            }

            FinalObject obj = new FinalObject
            {
                Name = OName,
                PhysicalAddress = OPhysicaladdress,
                DataSource = ODatasource,
                Resident = OResident
            };

            tw.WriteLine(obj.PhysicalAddress, obj.DataSource, obj.Name);
            /* System.IO.File.WriteAllLines(OutputFilename, FinalObject); */
        }
Now I just tried both your examples in sqlfiddle and they both work. My code is an exact copy of yours so this must have something to do with C#.
ASKER CERTIFIED SOLUTION
Avatar of slightwv (䄆 Netminder)
slightwv (䄆 Netminder)

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
We cross posted.

>>output file notice how name=POWMATQP in the beginning but goes to blank for the rest

Using my compiled console app and your example name:

XMlparse.exe | findstr "POWMATQP"
Physical Name = IVIOINFO, Data Source = POWMATQP, Name=IVItem Other Info
Physical Name = CUSTORDR, Data Source = POWMATQP, Name=Orders Table
Physical Name = CSTQUTHD, Data Source = POWMATQP, Name=OEQuotes Header
Physical Name = CSTQUTLN, Data Source = POWMATQP, Name=OEQuotes Lines
Physical Name = CSTQUTKT, Data Source = POWMATQP, Name=OEQuote Lines Kit
Physical Name = NOTELINE, Data Source = POWMATQP, Name=OE QuotesNotesLines
Physical Name = IVPLVLVN, Data Source = POWMATQP, Name=IVItmVndPriceBreak
Physical Name = QUIKSCAN, Data Source = POWMATQP, Name=OE QuickScanTable
Physical Name = TEMPQUOT, Data Source = POWMATQP, Name=OE TempSimilarQuotes
Physical Name = OEONETMQ, Data Source = POWMATQP, Name=OE OneTimeQuotes
Physical Name = RFQHEADR, Data Source = POWMATQP, Name=IV RFQHeader
Physical Name = RFQLINES, Data Source = POWMATQP, Name=IV RFQLines
Physical Name = RFQNOTES, Data Source = POWMATQP, Name=IV RFQ Notes
Physical Name = RFQSTLOG, Data Source = POWMATQP, Name=IV RFQ Transmit Log
Physical Name = RFQSCTRL, Data Source = POWMATQP, Name=OE Control RFQ's
Physical Name = PRINTERS, Data Source = POWMATQP, Name=Printer Table
Physical Name = CONTACTF, Data Source = POWMATQP, Name=Contact File Main
Physical Name = CONTACTC, Data Source = POWMATQP, Name=Contact File Contact
Physical Name = CONTACTP, Data Source = POWMATQP, Name=Contact File Product
Physical Name = CFMNNOTE, Data Source = POWMATQP, Name=Contact File Main(N)
Physical Name = CFCNNOTE, Data Source = POWMATQP, Name=Contact File Cnct(N)
Physical Name = CFPNNOTE, Data Source = POWMATQP, Name=Contact File Prod(N)
Physical Name = SHIPINFO, Data Source = POWMATQP, Name=Shipping Information
Physical Name = SHIPCARR, Data Source = POWMATQP, Name=Shipping Carriers
Physical Name = SHIPINST, Data Source = POWMATQP, Name=Shipping Remarks
Physical Name = SHIPDETL, Data Source = POWMATQP, Name=Shipment Detail
Physical Name = SHIPHEAD, Data Source = POWMATQP, Name=Shipment Header
Physical Name = SHIPITEM, Data Source = POWMATQP, Name=Shipment Detail Item
Physical Name = STAXINFO, Data Source = POWMATQP, Name=AP Notes/Sales Tax
Physical Name = STAXRMKS, Data Source = POWMATQP, Name=AP Notes & Remarks
Physical Name = STAXNOTE, Data Source = POWMATQP, Name=AP Sales Tax Notes
Physical Name = APSTNOTE, Data Source = POWMATQP, Name=AP/Sales Tax Note(N)
Physical Name = USERTBLE, Data Source = POWMATQP, Name=User ID Table
Physical Name = COMPINFO, Data Source = POWMATQP, Name=Competitive Info
Physical Name = DEPTTYPE, Data Source = POWMATQP, Name=Department Types
Physical Name = QTPORCDS, Data Source = POWMATQP, Name=OE PO Setup Records
Physical Name = QTPOCMNT, Data Source = POWMATQP, Name=OE PO Setup Comments
Physical Name = POEXNOTE, Data Source = POWMATQP, Name=PO Expedite Note
Physical Name = POEXLNNT, Data Source = POWMATQP, Name=POLine Expedite Note
Physical Name = OTAPNOTE, Data Source = POWMATQP, Name=ONETIME AP Notes
Physical Name = OEORTRCK, Data Source = POWMATQP, Name=Orders by Customer
Physical Name = ORDRFILL, Data Source = POWMATQP, Name=Order Fullfillment
Physical Name = VENDNOTE, Data Source = POWMATQP, Name=Vendor Notes
Physical Name = RFDSCTRL, Data Source = POWMATQP, Name=Control RFD's
Physical Name = RFDHEADR, Data Source = POWMATQP, Name=IV RFDHeader
Physical Name = RFDLINES, Data Source = POWMATQP, Name=IV RFDLines
Physical Name = VNDEMAILS, Data Source = POWMATQP, Name=VNDEMAILS
Physical Name = PAYRHEDR, Data Source = POWMATQP, Name=PAYROLL HEADER
Physical Name = PAYRDATA, Data Source = POWMATQP, Name=PAYROLL DETAIL
Physical Name = PGRMREFS, Data Source = POWMATQP, Name=PGRMREFS
Physical Name = ACTNALRT, Data Source = POWMATQP, Name=ACTNALRT
Physical Name = ACTNITEM, Data Source = POWMATQP, Name=ACTNITEM
Physical Name = ACTNLINK, Data Source = POWMATQP, Name=ACTNLINK
Physical Name = ACTNOTES, Data Source = POWMATQP, Name=ACTNOTES
Physical Name = ALRTNOTE, Data Source = POWMATQP, Name=ALRTNOTE
Physical Name = AMARKETS, Data Source = POWMATQP, Name=AMARKETS
Physical Name = CERTORGN, Data Source = POWMATQP, Name=CERTORGN
Physical Name = CORRACTN, Data Source = POWMATQP, Name=CORRACTN
Physical Name = CUSTINQR, Data Source = POWMATQP, Name=CUSTINQR
Physical Name = MTRJSPRT, Data Source = POWMATQP, Name=MTRJSPRT
Physical Name = MTRTAUTH, Data Source = POWMATQP, Name=MTRTAUTH
Physical Name = PRVNACTN, Data Source = POWMATQP, Name=PRVNACTN
Physical Name = SPERFRPT, Data Source = POWMATQP, Name=SPERFRPT
Physical Name = SUPPCART, Data Source = POWMATQP, Name=SUPPCART
Physical Name = SUPPDETL, Data Source = POWMATQP, Name=SUPPDETL
Physical Name = SYSCNTRL, Data Source = POWMATQP, Name=SYSCNTRL
Physical Name = POPHEADR, Data Source = POWMATQP, Name=POPHEADR
Physical Name = POPLINES, Data Source = POWMATQP, Name=POPLINES
Physical Name = POPTOSOP, Data Source = POWMATQP, Name=POPTOSOP
Physical Name = POSOPPOP, Data Source = POWMATQP, Name=POSOPPOP
Physical Name = SOPHEADR, Data Source = POWMATQP, Name=SOPHEADR
Physical Name = SOPLINES, Data Source = POWMATQP, Name=SOPLINES
Physical Name = SOPTOQOT, Data Source = POWMATQP, Name=SOPTOQOT
Physical Name = XFERHSBC, Data Source = POWMATQP, Name=XFERHSBC
Physical Name = PNTYNOTE, Data Source = POWMATQP, Name=PNTYNOTE
Physical Name = PO_FLAG, Data Source = POWMATQP, Name=PO_FLAG
Physical Name = COCPRNTD, Data Source = POWMATQP, Name=COC Printed
Physical Name = SYSCNTRL, Data Source = POWMATQP, Name=SYSCNTRL
Physical Name = ACTIVITY, Data Source = POWMATQP, Name=ACTIVITY
Physical Name = TIMECLCK, Data Source = POWMATQP, Name=TIMECLCK
Physical Name = ZZTEST, Data Source = POWMATQP, Name=ZZTEST
Physical Name = CSTQUTHD, Data Source = POWMATQP, Name=CSTQUTHD
Physical Name = POEXLNNT, Data Source = POWMATQP, Name=POEXLNNT
Physical Name = DOCMTYPE, Data Source = POWMATQP, Name=DOCMTYPE
Physical Name = RESNCODE, Data Source = POWMATQP, Name=RESNCODE
Physical Name = SOPHDRIM, Data Source = POWMATQP, Name=SOPHDRIM
Physical Name = SOPLINIM, Data Source = POWMATQP, Name=SOPLINIM
Physical Name = CUSTORDR, Data Source = POWMATQP, Name=CUSTORDR
Physical Name = PAYRDATA, Data Source = POWMATQP, Name=PAYRDATA
Physical Name = CSTCHNGR, Data Source = POWMATQP, Name=CSTCHNGR
Physical Name = Customers_to_Delete, Data Source = POWMATQP, Name=Customers_to_Delete
Physical Name = INCDDESC, Data Source = POWMATQP, Name=INCDDESC
Physical Name = INCDRESP, Data Source = POWMATQP, Name=INCDRESP
Physical Name = INVSUMRY, Data Source = POWMATQP, Name=INVSUMRY
Physical Name = POSOPWRK, Data Source = POWMATQP, Name=POSOPWRK
Physical Name = IVPLVLVN, Data Source = POWMATQP, Name=IVPLVLVN
Physical Name = Test, Data Source = POWMATQP, Name=Test
Physical Name = CUSTLIST, Data Source = POWMATQP, Name=CUSTLIST
Physical Name = ITMRFQPO, Data Source = POWMATQP, Name=ITMRFQPO
Physical Name = PARTLIST, Data Source = POWMATQP, Name=PARTLIST
Physical Name = EMAILLOG, Data Source = POWMATQP, Name=EMAILLOG
Physical Name = , Data Source = POWMATQP, Name=
Physical Name = NavbarMenuTbl, Data Source = POWMATQP, Name=NavbarMenuTbl

Open in new window

I will be trying this out shortly and the first thing I will try is changing POWMATQP in the input xml file to GP-POWMAT and see if I get a value for name.
Worked for me:
test.exe | findstr "GP-POWMAT"
Physical Name = BM00101, Data Source = GP-POWMAT, Name=BM00101
Physical Name = BM00111, Data Source = GP-POWMAT, Name=BM00111
Physical Name = CM00100, Data Source = GP-POWMAT, Name=CM00100
Physical Name = CM20200, Data Source = GP-POWMAT, Name=CM20200
Physical Name = IV00101, Data Source = GP-POWMAT, Name=IV00101
Physical Name = IV00102, Data Source = GP-POWMAT, Name=IV00102
Physical Name = IV00103, Data Source = GP-POWMAT, Name=IV00103
Physical Name = IV00104, Data Source = GP-POWMAT, Name=IV00104
Physical Name = IV00105, Data Source = GP-POWMAT, Name=IV00105
Physical Name = IV00106, Data Source = GP-POWMAT, Name=IV00106
Physical Name = IV00107, Data Source = GP-POWMAT, Name=IV00107
Physical Name = IV00108, Data Source = GP-POWMAT, Name=IV00108
Physical Name = IV10200, Data Source = GP-POWMAT, Name=IV10200
Physical Name = IV40201, Data Source = GP-POWMAT, Name=IV40201
Physical Name = IV40202, Data Source = GP-POWMAT, Name=IV40202
Physical Name = IV40400, Data Source = GP-POWMAT, Name=IV40400
Physical Name = IV40401, Data Source = GP-POWMAT, Name=IV40401
Physical Name = IV40600, Data Source = GP-POWMAT, Name=IV40600
Physical Name = IV40700, Data Source = GP-POWMAT, Name=IV40700
Physical Name = IV41100, Data Source = GP-POWMAT, Name=IV41100
Physical Name = MC40000, Data Source = GP-POWMAT, Name=MC40000
Physical Name = PM00200, Data Source = GP-POWMAT, Name=PM00200
Physical Name = PM00300, Data Source = GP-POWMAT, Name=PM00300
Physical Name = PM00400, Data Source = GP-POWMAT, Name=PM00400
Physical Name = PM10300, Data Source = GP-POWMAT, Name=PM10300
Physical Name = PM30200, Data Source = GP-POWMAT, Name=PM30200
Physical Name = PM30300, Data Source = GP-POWMAT, Name=PM30300
Physical Name = POP10100, Data Source = GP-POWMAT, Name=POP10100
Physical Name = POP10110, Data Source = GP-POWMAT, Name=POP10110
Physical Name = POP10300, Data Source = GP-POWMAT, Name=POP10300
Physical Name = POP10500, Data Source = GP-POWMAT, Name=POP10500
Physical Name = POP10550, Data Source = GP-POWMAT, Name=POP10550
Physical Name = POP10600, Data Source = GP-POWMAT, Name=POP10600
Physical Name = POP30100, Data Source = GP-POWMAT, Name=POP30100
Physical Name = POP30110, Data Source = GP-POWMAT, Name=POP30110
Physical Name = POP30300, Data Source = GP-POWMAT, Name=POP30300
Physical Name = POP40100, Data Source = GP-POWMAT, Name=POP40100
Physical Name = POP70100, Data Source = GP-POWMAT, Name=POP70100
Physical Name = RM00101, Data Source = GP-POWMAT, Name=RM00101
Physical Name = RM00102, Data Source = GP-POWMAT, Name=RM00102
Physical Name = RM00103, Data Source = GP-POWMAT, Name=RM00103
Physical Name = RM00301, Data Source = GP-POWMAT, Name=RM00301
Physical Name = RM10301, Data Source = GP-POWMAT, Name=RM10301
Physical Name = RM30701, Data Source = GP-POWMAT, Name=RM30701
Physical Name = RM50101, Data Source = GP-POWMAT, Name=RM50101
Physical Name = RM50103, Data Source = GP-POWMAT, Name=RM50103
Physical Name = SOP10100, Data Source = GP-POWMAT, Name=SOP10100
Physical Name = SOP10107, Data Source = GP-POWMAT, Name=SOP10107
Physical Name = SOP10200, Data Source = GP-POWMAT, Name=SOP10200
Physical Name = SOP10202, Data Source = GP-POWMAT, Name=SOP10202
Physical Name = SOP30200, Data Source = GP-POWMAT, Name=SOP30200
Physical Name = SOP30201, Data Source = GP-POWMAT, Name=SOP30201
Physical Name = SOP30300, Data Source = GP-POWMAT, Name=SOP30300
Physical Name = SOP40100, Data Source = GP-POWMAT, Name=SOP40100
Physical Name = SOP40200, Data Source = GP-POWMAT, Name=SOP40200
Physical Name = SOP40300, Data Source = GP-POWMAT, Name=SOP40300
Physical Name = SOP40400, Data Source = GP-POWMAT, Name=SOP40400
Physical Name = SOP50100, Data Source = GP-POWMAT, Name=SOP50100
Physical Name = SOP60100, Data Source = GP-POWMAT, Name=SOP60100
Physical Name = SOP60300, Data Source = GP-POWMAT, Name=SOP60300
Physical Name = SOP70100, Data Source = GP-POWMAT, Name=SOP70100
Physical Name = SY00500, Data Source = GP-POWMAT, Name=SY00500
Physical Name = SY00600, Data Source = GP-POWMAT, Name=SY00600
Physical Name = SY01200, Data Source = GP-POWMAT, Name=SY01200
Physical Name = SY03000, Data Source = GP-POWMAT, Name=SY03000
Physical Name = SY03300, Data Source = GP-POWMAT, Name=SY03300
Physical Name = SY03900, Data Source = GP-POWMAT, Name=SY03900
Physical Name = TEMPQUOTE, Data Source = GP-POWMAT, Name=TEMPQUOTE
Physical Name = test_locking, Data Source = GP-POWMAT, Name=test_locking
Physical Name = MyQuotes, Data Source = GP-POWMAT, Name=MyQuotes
Physical Name = MyQuotesN, Data Source = GP-POWMAT, Name=MyQuotesN

Open in new window

I am heading to my office right now and will try this straight away and let you know.
Bingo, we have success! Thank you for all your assistance and patience.
Thanks again!
Glad you got it working and happy to help.