Ταξινόμηση XML για

ψήφοι
0

Έχω μετατραπεί ένα xsd να κωδικοποιήσει τη χρήση της γεννήτριας XSD2Code. Το εργαλείο λειτουργεί μεγάλο και είμαι συνέχειες xml χρησιμοποιώντας τον κώδικα για να στείλετε ένα αίτημα στην υπηρεσία web.

Εδώ είναι το μέρος του δείγματος από XML που δημιουργούνται.

<OrderDetails>
  <StockLine>        
    <StockCode>StockCode1</StockCode>
    <StockDescription>Description1</StockDescription>
  </StockLine>
  <StockLine>        
    <StockCode>StockCode2</StockCode>
    <StockDescription>Description2</StockDescription>        
  </StockLine>
  <CommentLine>        
    <Comment>Comment1</Comment>        
  </CommentLine>
  <CommentLine>       
    <Comment>Comment2</Comment>        
  </CommentLine>
</OrderDetails>

Είμαι προσθέτοντας κάθε στοιχείο από το τραπέζι τα δεδομένα μου, η οποία έχει τρεις στήλες Stockcode, περιγραφή και σχόλιο. Δείτε το δείγμα κώδικα που φαίνεται παρακάτω. Η λογική που περίμενα ήταν να εισάγετε τον κόμβο αμέσως μετά, αν Datarow δεν είναι μηδενική για τη στήλη Σχόλιο στο τραπέζι τα δεδομένα μου. Όμως, αντί να προσθέτει όλο το και στη συνέχεια προσθήκη.

Η κατά τη χρήση της κλάσης xsd σειριακή έχει δύο λίστες, μία για Stockline και ένα άλλο για τα σχόλια. Όταν συνέχειες xml ακολουθεί τη σειρά και να τα εισάγει όλα τα στοιχεία από τη λίστα και στη συνέχεια.

PORTOIDOC.OrderDetails orderDetails = new PORTOIDOC.OrderDetails();
for (int i = 0; i < PODatatTable.Rows.Count; i++)
{
    PORTOIDOC.StockLine stkline = new PORTOIDOC.StockLine();                
    stkline.StockCode = PODatatTable.Rows[i][StockCode].ToString();
    stkline.StockDescription = PODatatTable.Rows[i][Description].ToString();
    orderDetails.StockLine.Add(stkline);
    PORTOIDOC.CommentLine cmnt = new PORTOIDOC.CommentLine();                
    if (PODatatTable.Rows[i][Comment] != null)
    {
        cmnt.Comment = PODatatTable.Rows[i][Comment].ToString();
        orderDetails.CommentLine.Add(cmnt);
    }

}

Αυτό είναι ό, τι χρειάζεστε ιδανικά σχηματιστεί xml μου να μοιάσει. Αν Datarow σε datatable έχει Σχόλιο τότε το σχόλιο Κόμβος πρέπει να εισαχθεί αμέσως μετά StockLine.

<OrderDetails>
  <StockLine>        
    <StockCode>StockCode1</StockCode>
    <StockDescription>Description1</StockDescription>
  </StockLine>
  <CommentLine>        
    <Comment>Comment1</Comment>        
  </CommentLine>
  <StockLine>        
    <StockCode>StockCode2</StockCode>
    <StockDescription>Description2</StockDescription>        
  </StockLine>      
  <CommentLine>       
    <Comment>Comment2</Comment>        
  </CommentLine>
</OrderDetails>

Πώς μπορώ να ταξινομήσετε XML μου αφού παράγεται σε ευθυγράμμιση με τη datatable.?

ΓραμμέςΠαραγγελίας Class

public OrderDetails()
        {
            this.freightLineField = new List<FreightLine>();
            this.miscChargeLineField = new List<MiscChargeLine>();
            this.commentLineField = new List<CommentLine>();
            this.stockLineField = new List<StockLine>();
        }

        [System.Xml.Serialization.XmlElementAttribute(StockLine, Order = 0)]
        public List<StockLine> StockLine
        {
            get
            {
                return this.stockLineField;
            }
            set
            {
                this.stockLineField = value;
            }
        }

        [System.Xml.Serialization.XmlElementAttribute(CommentLine, Order = 1)]
        public List<CommentLine> CommentLine
        {
            get
            {
                return this.commentLineField;
            }
            set
            {
                this.commentLineField = value;
            }
        }

        [System.Xml.Serialization.XmlElementAttribute(MiscChargeLine, Order = 2)]
        public List<MiscChargeLine> MiscChargeLine
        {
            get
            {
                return this.miscChargeLineField;
            }
            set
            {
                this.miscChargeLineField = value;
            }
        }

        [System.Xml.Serialization.XmlElementAttribute(FreightLine, Order = 3)]
        public List<FreightLine> FreightLine
        {
            get
            {
                return this.freightLineField;
            }
            set
            {
                this.freightLineField = value;
            }
        }

        private static System.Xml.Serialization.XmlSerializer Serializer
        {
            get
            {
                if ((serializer == null))
                {
                    serializer = new System.Xml.Serialization.XmlSerializer(typeof(OrderDetails));
                }
                return serializer;
            }
        }

        #region Serialize/Deserialize
        /// <summary>
        /// Serializes current OrderDetails object into an XML document
        /// </summary>
        /// <returns>string XML value</returns>
        public virtual string Serialize()
        {
            System.IO.StreamReader streamReader = null;
            System.IO.MemoryStream memoryStream = null;
            try
            {
                memoryStream = new System.IO.MemoryStream();
                Serializer.Serialize(memoryStream, this);
                memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
                streamReader = new System.IO.StreamReader(memoryStream);
                return streamReader.ReadToEnd();
            }
            finally
            {
                if ((streamReader != null))
                {
                    streamReader.Dispose();
                }
                if ((memoryStream != null))
                {
                    memoryStream.Dispose();
                }
            }
        }
Δημοσιεύθηκε 27/11/2018 στις 17:42
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Ο ακόλουθος κώδικας θα πρέπει να εργαστεί

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

namespace ConsoleApplication86
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";

        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            DataTable dt = new DataTable();
            dt.Columns.Add("StockCode", typeof(string));
            dt.Columns.Add("StockDescription", typeof(string));
            dt.Columns.Add("Comment", typeof(string));

            XElement orderDetails = doc.Descendants("OrderDetails").FirstOrDefault();

            DataRow newRow = null;
            foreach(XElement orderDetail in orderDetails.Elements())
            {

                switch (orderDetail.Name.LocalName)
                {
                    case "StockLine":
                        newRow = dt.Rows.Add();
                        newRow["StockCode"] = (string)orderDetail.Descendants("StockCode").FirstOrDefault();
                        newRow["StockDescription"] = (string)orderDetail.Descendants("StockDescription").FirstOrDefault();
                        break;
                    case "CommentLine":
                           newRow["Comment"] = (string)orderDetail.Descendants("Comment").FirstOrDefault();
                        break;
                }


            }


         }

    }



}
Απαντήθηκε 27/11/2018 στις 18:29
πηγή χρήστη

ψήφοι
1

Ναι, μπορείτε να ταξινομήσετε τη χρήση LINQ, αλλά σκέφτομαι ότι είστε στην πραγματικότητα προσπαθούν να σημαίνει ένωση με διάταξη αντί του περιορισμού. Υποθέτοντας Comment1 συνδέεται με Stockcode1, και Comment2 ανήκει στην Comment2, ίσως μια δομή σαν αυτή θα καλύψουν καλύτερα τις ανάγκες σας:

<OrderDetails>
  <StockLine>        
    <StockCode>StockCode1</StockCode>
      <StockDescription>Description1</StockDescription>
      <CommentLine>        
        <Comment>Comment1</Comment>        
      </CommentLine>
  </StockLine>
  <StockLine>        
      <StockCode>StockCode2</StockCode>
      <StockDescription>Description2</StockDescription>
      <CommentLine>       
        <Comment>Comment2</Comment>        
      </CommentLine>        
  </StockLine>      
</OrderDetails>

Στη συνέχεια, μπορείτε να αλλάξετε ελαφρώς τη λογική ανάλυσης σας για να επεξεργαστεί τα σχόλια που σχετίζονται με κάθε StockLine.

Απαντήθηκε 27/11/2018 στις 18:08
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more