XElement中的多个值

时间:2014-07-22 16:03:55

标签: xml xsd linq-to-xml grouping xelement

我必须将csv转换为xml并使用xsd进行验证。

我的问题是,我的outpot与xsd不同。

我现在不怎么做.. :(

这是我的xsd代码:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:distributor-import" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Distributor">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="Transaction">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="TransactionNr" type="xs:string" />
                    <xs:element name="AdressNr" type="xs:string" />
                    <xs:element name="Firma" type="xs:string" />
                    <xs:element name="PLZ" type="xs:unsignedShort" />
                    <xs:element name="Ort" type="xs:string" />
                    <xs:element name="Strasse" type="xs:string" />
                    <xs:element maxOccurs="unbounded" name="Artikel">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="ArtikelNr" type="xs:string" />
                          <xs:element name="Artikelbezeichnung" type="xs:string" />
                          <xs:element name="Menge" type="xs:int" />
                          <xs:element name="Einheit" type="xs:string" />
                          <xs:element name="Lieferdatum" type="xs:unsignedInt" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我有这个输出:

<Distributor name="Lekkerland">
    <Transaction>
      <TransactionNr>5632</TransactionNr>
      <AdressNr>9853</AdressNr>
      <Firma>Migrolino</Firma>
      <PLZ>4000</PLZ>
      <Ort>Basel</Ort>
      <Strasse>Nauenstrasse 80</Strasse>
      <Artikel>
        <ArtikelNr>804002</ArtikelNr>
        <Artikelbezeichnung>OCB Slim Premium</Artikelbezeichnung>
        <Menge>30</Menge>
        <Einheit>Stk</Einheit>
        <Lieferdatum>20131215</Lieferdatum>
      </Artikel>
    </Transaction>
  </Distributor>
  <Distributor name="Lekkerland">
    <Transaction>
      <TransactionNr>5622</TransactionNr>
      <AdressNr>9853</AdressNr>
      <Firma>Migrolino</Firma>
      <PLZ>4000</PLZ>
      <Ort>Basel</Ort>
      <Strasse>Nauenstrasse 80</Strasse>
      <Artikel>
        <ArtikelNr>801002</ArtikelNr>
        <Artikelbezeichnung>OCB Slim Premium</Artikelbezeichnung>
        <Menge>80</Menge>
        <Einheit>Stk</Einheit>
        <Lieferdatum>20131215</Lieferdatum>
      </Artikel>
    </Transaction>
  </Distributor>

但我需要这个输出:

 <Distributor name="Lekkerland">
    <Transaction>
      <TransactionNr>5632</TransactionNr>
      <AdressNr>9853</AdressNr>
      <Firma>Migrolino</Firma>
      <PLZ>4000</PLZ>
      <Ort>Basel</Ort>
      <Strasse>Nauenstrasse 80</Strasse>
      <Artikel>
        <ArtikelNr>804002</ArtikelNr>
        <Artikelbezeichnung>OCB Slim Premium</Artikelbezeichnung>
        <Menge>30</Menge>
        <Einheit>Stk</Einheit>
        <Lieferdatum>20131215</Lieferdatum>
      </Artikel>
    </Transaction>
    <Transaction>
      <TransactionNr>5622</TransactionNr>
      <Artikel>
        <ArtikelNr>801002</ArtikelNr>
        <Artikelbezeichnung>OCB Slim Premium</Artikelbezeichnung>
        <Menge>80</Menge>
        <Einheit>Stk</Einheit>
        <Lieferdatum>20131215</Lieferdatum>
      </Artikel>
    </Transaction>
  </Distributor>

我该怎么做?有没有人可以帮助我?

1 个答案:

答案 0 :(得分:0)

        foreach( var distributor in csvGroup.GroupBy(d => d.GetValue(distributorID)))
        {
            xmlDoc.Root.Add(

                             new  XElement(ns + "Distributor",
                             new XAttribute("name", distributor.Key)));

                             foreach (var transaction in distributor.GroupBy(b => b.GetValue(transactionID)))
                             {
                                 xmlDoc.Root.Elements(ns + "Distributor").Where(d => d.Attribute("name").Value == distributor.Key.ToString()).First().Add(

                                    new XElement(ns + "Transaction",
                                    new XElement(ns + "TransactionNr", transaction.Key),
                                     new XElement(ns + "AdressNr", transaction.First().GetValue(addressID)),
                                     new XElement(ns + "Firma", transaction.First().GetValue(companyID)),
                                     new XElement(ns + "PLZ", transaction.First().GetValue(postalID)),
                                     new XElement(ns + "Ort", transaction.First().GetValue(placeID)),
                                     new XElement(ns + "Strasse", transaction.First().GetValue(streetID))));

                                 foreach (var artikel in transaction)
                                 {

                                     xmlDoc.Root.Elements(ns + "Distributor").Where(d => d.Attribute("name").Value == distributor.Key.ToString()).First().Elements(ns + "Transaction").Where(t => t.Elements(ns + "TransactionNr").First().Value == transaction.Key.ToString()).First().Add(

                                         new XElement(ns + "Artikel",
                                         new XElement(ns + "ArtikelNr", artikel[articelID]),
                                         new XElement(ns + "Artikelbezeichnung", artikel[articeldescriptionID]),
                                         new XElement(ns + "Menge", artikel[amountID]),
                                         new XElement(ns + "Einheit", artikel[unitID]),
                                         new XElement(ns + "Lieferdatum", artikel[deliveryID])));
                                 }
                             }
                             xmlDoc.Save("xmldoc.xml");
                             xmlDoc.Save("c:/test.xml");
        }