我该如何操作,一次一个XML文档父元素? [英] How do I manipulate an XML document one parent element at a time?

查看:122
本文介绍了我该如何操作,一次一个XML文档父元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想服用含有从在线购物车多个订单的XML文件,使用C#和Visual Studio 2008年。我已经尝试了各种分析它,并输出每个订单的价值观作为自己的文本文件(不是XML)在这一点的方法,但有没有运气。我最后的尝试包括foreach语句绑XmlNodeList中,并尝试使用的XMLReader写的每个元素值的字符串执行我的翻译名称为订单的每个节点。在fo​​reach似乎什么不与当前的配置工作。

I am trying to take an XML file containing multiple orders from an online shopping cart, parse it and output the values of each order as its own text file (not XML) using C# and Visual Studio 2008. I have tried a variety of methods at this point, but have had no luck. My last attempted included a foreach statement tied to XMLNodeList and trying to execute my translation for each node with the name "Order" by using XMLReader to write each elements value to a string. The foreach seems to be what is not working with the current configuration.

有没有更好的办法做到这一点还是我需要使用foreach保持?所有的心思都不胜感激。

Is there a better way to do this or do I need to keep using a foreach? All thoughts are greatly appreciated.

 class Class1
  {
     public static void Main()
      {

        StringBuilder orderid = new StringBuilder();
        StringBuilder ordernumber = new StringBuilder();
        StringBuilder name = new StringBuilder();
        StringBuilder staddress = new StringBuilder();
        StringBuilder city = new StringBuilder();
        StringBuilder state = new StringBuilder();
        StringBuilder zip = new StringBuilder();
        StringBuilder country = new StringBuilder();
        StringBuilder email = new StringBuilder();
        StringBuilder partnumber = new StringBuilder();
        StringBuilder quantity = new StringBuilder();

            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\onlinesales\neworders.xml");
            XmlNode root = doc.DocumentElement;

            XmlNodeList nodeList = root.SelectNodes("Order");
            foreach (XmlNode order in nodeList)
            {

                using (XmlReader reader = XmlReader.Create("Order"))
                {
                    reader.ReadToFollowing("OrderNumber");
                    ordernumber.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("OrderGUID");
                    orderid.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("FirstName");
                    name.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("Email");
                    email.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("BillingAddress1");
                    staddress.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("BillingCity");
                    city.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("BillingState");
                    state.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("BillingZip");
                    zip.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("BillingCountry");
                    country.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("Quantity");
                    quantity.Append(reader.ReadElementContentAsString());

                    reader.ReadToFollowing("OrderedProductManufacturerPartNumber");
                    partnumber.Append(reader.ReadElementContentAsString());
                }

            using (StreamWriter fileout =
                new StreamWriter("W:" + DateTime.Now.ToString("yyyyy-MM-dd_hh-mm-ss-ff") + ".txt", false, Encoding.ASCII))
            {
                fileout.WriteLine("ISA*00*          *00*          *ZZ*daisywebstore  *12*5016361200     *" + DateTime.Now.ToString("yyMMdd") + "*1559*U*00400*000001649*0*P>~");
                fileout.WriteLine("GS*PO*daisywebstore*5016361200*" + DateTime.Now.ToString("yyyyMMdd") + "*" + DateTime.Now.ToString("HHmm") + "*1649*X*004010~");
                fileout.WriteLine("ST*850*13~");
                fileout.WriteLine("BEG*00*SA*08272226001*" + DateTime.Now.ToString("yyyyMMdd") + "~");
                fileout.WriteLine("REF*DP*089~");
                fileout.WriteLine("DTM*002*20120104~");
                fileout.WriteLine("N1*ST*" + name + "~");
                fileout.WriteLine("N3*" + staddress + "~");
                fileout.WriteLine("N4*" + city + "*" + state + "*" + zip + "~");
                fileout.WriteLine("N1*RE**92*00103653341~");
                fileout.WriteLine("PO1*1*6*EA*33.28*TE*IN*985880-542~");
                fileout.WriteLine("PID*F*****CO2 BB PISTOL     $ 5693~");
                fileout.WriteLine("PO4*3*1*EA~");
                fileout.WriteLine("CT*1~");
                fileout.WriteLine("AMT*1*199.68~");
                fileout.WriteLine("SE*16*13~");
            }
                    }
                //File.Delete(@"C:\onlinesales\neworders.xml");
}
}



}

}

推荐答案

您可以使这种超级简单。面向对象的编程是要走的路。

You can make this super simple. Object oriented programming is the way to go.

所以说,你创建一个类订单接受一个的XElement。我会写几行你

So say you create a class Order that takes an XElement. I'll write a couple lines for you.

public class Order
{
    XElement self;
    public Order(XElement order)
    {
        self = order;
    }

    public XElement Element { get { return self; } }

    public string OrderNumber 
    { 
        // if your xml looks like <Order OrderNumber="somenumber" />
        get { return (string)(self.Attribute("OrderNumber") ?? (object)"some default value/null"); } 
        // but if it looks like: <Order><OrderNumber>somenumber</OrderNumber></Order>
        // get { return (string)(self.Element("OrderNumber") ?? (object)"some default value/null"); }
    }
}

您必须填写的休息订单的属性自己。每个订单的价值,使像我上面所做的ORDERNUMBER的属性。 。其性质为每个订单值使访问数据超级简单

You'll have to fill in the rest of the Order's properties yourself. For each Order value, make a property like the OrderNumber I made above. Having properties for each Order value makes accessing the data super simple.

因此​​,对于主代码你必须:

So for your main code you'd have:

XElement file = XElement.Load(@"C:\onlinesales\neworders.xml");
Order[] orders = file.Elements("Order").Select(e => new Order(e)).ToArray();

现在,你把所有的订单为单个订单的对象,从属性列表作为读取数据你输出到该文件。现在有没有必要存储的StringBuilder的值,因为这些值都在Order对象。

Now that you have all your orders as individual Order objects, read the data from the list of properties as you output to the file. There's no need now to store the values in StringBuilder's because the values are in the Order objects.

foreach(Order order in orders)
{
   // write order.OrderNumber  etc. / do whatever you want with the orders.
}

这篇关于我该如何操作,一次一个XML文档父元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆