簡體   English   中英

將XML讀取到linq對象,然后創建XML

[英]Read XML to linq object, then create XML

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<pp010 xmlns="http://www.123456768.com/technology">
<rptHdr>
<exchNam>MyXML</exchNam>
<envText>P</envText>
<rptCod>pp010</rptCod>
<rptNam>Daily Stock</rptNam>
<membLglNam>CompanyA</membLglNam>
<rptPrntEffDat>2015-04-14</rptPrntEffDat>
<rptPrntRunDat>2015-04-14</rptPrntRunDat>
</rptHdr>
<pp010Grp>
<pp010KeyGrp>
<membClgIdCod>HBGKP</membClgIdCod>
</pp010KeyGrp>
<pp010Grp1>
<pp010KeyGrp1>
<membExchIdCod>JBGJG</membExchIdCod>
</pp010KeyGrp1>
<pp010Grp2>
<pp010KeyGrp2>
<currTypCod>CHF</currTypCod>
</pp010KeyGrp2>
<pp010Grp3>
<pp010KeyGrp3>
<acctTypGrp>PP</acctTypGrp>
</pp010KeyGrp3>
<pp010Rec>
    <mgnGrpCod>     </mgnGrpCod>
    <mgnClsCod>CSLN </mgnClsCod>
    <mgnPremiumAmnt>+222926.00</mgnPremiumAmnt>
    <mgnLiqDlvAmnt>+0.00</mgnLiqDlvAmnt>
    <mgnSprdAmnt>+0.00</mgnSprdAmnt>
    <mgnAddlAmnt>+89349.30</mgnAddlAmnt>
    <unadjMgnReq>+312275.30</unadjMgnReq>
</pp010Rec>
<pp010Rec>
    <mgnGrpCod>     </mgnGrpCod>
    <mgnClsCod>CSLM </mgnClsCod>
    <mgnPremiumAmnt>+55112.00</mgnPremiumAmnt>
    <mgnLiqDlvAmnt>+0.00</mgnLiqDlvAmnt>
    <mgnSprdAmnt>+0.00</mgnSprdAmnt>
    <mgnAddlAmnt>+30854.40</mgnAddlAmnt>
    <unadjMgnReq>+85966.40</unadjMgnReq>
</pp010Rec>

我正在使用以下代碼,但似乎無法使用來自...的數據創建一個IEnumberable。

public class MarginRep
{
 public string mgnGrpCod {get;set;}
 public string mgnClsCod {get;set;}
 public string mgnPremiumAmnt {get;set;}
 public string mgnLiqDlvAmnt {get;set;}
 public string mgnSprdAmnt {get;set;}
 public string mgnAddlAmnt {get;set;}
 public string unadjMgnReq {get;set;}                      
    }

 private void button1_Click(object sender, EventArgs e)
 {
  string file =    @"D:\WorkDesktop\VisualStudio\file.xml";

  XDocument xmlDoc = XDocument.Load(file);

 IEnumerable<MarginRep> myMarginRep = 
 from c in xmlDoc.Descendants("pp010Rec")


            select new MarginRep()
            {
             mgnGrpCod = (string)c.Attribute("mgnGrpCod"),
             mgnClsCod = (string)c.Attribute("mgnClsCod"),
             mgnPremiumAmnt = (string)c.Attribute("mgnPremiumAmnt"),
             mgnLiqDlvAmnt = (string)c.Attribute("mgnLiqDlvAmnt"),
             mgnSprdAmnt = (string)c.Attribute("mgnSprdAmnt"),
             mgnAddlAmnt = (string)c.Attribute("mgnAddlAmnt"),
             unadjMgnReq = (string)c.Attribute("unadjMgnReq"),

                      };


    }

抱歉,大量的XML。 我覺得我需要將其顯示為我不需要的前幾行,並且似乎無法向下瀏覽pp010Rec

如果您能提供任何幫助,我將不勝感激,如果您能指出我的學習方向,我可以花時間閱讀和嘗試一下。

干杯,

似乎您想要的是值而不是屬性,因此請更改:

  mgnGrpCod = (string)c.Attribute("mgnGrpCod"),

至:

  mgnGrpCod = (string)c.Element("mgnGrpCod").Value,

對其他屬性執行相同的操作

我對.xml進行了一些更改:

<?xml version="1.0" encoding="UTF-8"?>
<pp010 xmlns="http://www.123456768.com/technology">
<rptHdr>
<exchNam>MyXML</exchNam>
<envText>P</envText>
<rptCod>pp010</rptCod>
<rptNam>Daily Stock</rptNam>
<membLglNam>CompanyA</membLglNam>
<rptPrntEffDat>2015-04-14</rptPrntEffDat>
<rptPrntRunDat>2015-04-14</rptPrntRunDat>
</rptHdr>
<pp010Grp>
<pp0510KeyGrp>
<membClgIdCod>HBGKP</membClgIdCod>
</pp0510KeyGrp>
<pp010Grp1>
<pp010KeyGrp1>
<membExchIdCod>JBGJG</membExchIdCod>
</pp010KeyGrp1>
<pp010Grp2>
<pp010KeyGrp2>
<currTypCod>CHF</currTypCod>
</pp010KeyGrp2>
<pp010Grp3>
<pp010KeyGrp3>
<acctTypGrp>PP</acctTypGrp>
</pp010KeyGrp3>
<pp010Rec>
    <mgnGrpCod>     </mgnGrpCod>
    <mgnClsCod>CSLN </mgnClsCod>
    <mgnPremiumAmnt>+222926.00</mgnPremiumAmnt>
    <mgnLiqDlvAmnt>+0.00</mgnLiqDlvAmnt>
    <mgnSprdAmnt>+0.00</mgnSprdAmnt>
    <mgnAddlAmnt>+89349.30</mgnAddlAmnt>
    <unadjMgnReq>+312275.30</unadjMgnReq>
</pp010Rec>
<pp010Rec>
    <mgnGrpCod>     </mgnGrpCod>
    <mgnClsCod>CSLM </mgnClsCod>
    <mgnPremiumAmnt>+55112.00</mgnPremiumAmnt>
    <mgnLiqDlvAmnt>+0.00</mgnLiqDlvAmnt>
    <mgnSprdAmnt>+0.00</mgnSprdAmnt>
    <mgnAddlAmnt>+30854.40</mgnAddlAmnt>
    <unadjMgnReq>+85966.40</unadjMgnReq>
</pp010Rec>

</pp010Grp3>
</pp010Grp2>
</pp010Grp1>
</pp010Grp>

</pp010>

這樣你就可以跑步

public class MarginRep
    {
        public string mgnGrpCod { get; set; }
        public string mgnClsCod { get; set; }
        public string mgnPremiumAmnt { get; set; }
        public string mgnLiqDlvAmnt { get; set; }
        public string mgnSprdAmnt { get; set; }
        public string mgnAddlAmnt { get; set; }
        public string unadjMgnReq { get; set; }

        public override string ToString()
        {
            return string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}",
             mgnGrpCod, mgnClsCod, mgnPremiumAmnt, mgnLiqDlvAmnt, mgnSprdAmnt,
             mgnAddlAmnt, unadjMgnReq);
        }
    }

    var xmlDoc = XDocument.Load("1.xml");
    XNamespace xn = xmlDoc.Root.Name.Namespace;
    IEnumerable<MarginRep> myMarginRep = xmlDoc.Root.Descendants(xn + "pp010Rec")
    .Select(c => new MarginRep()
        {
            mgnGrpCod = c.Element(xn + "mgnGrpCod").Value,
            mgnClsCod = c.Element(xn + "mgnClsCod").Value,
            mgnPremiumAmnt = c.Element(xn + "mgnPremiumAmnt").Value,
            mgnLiqDlvAmnt = c.Element(xn + "mgnLiqDlvAmnt").Value,
            mgnSprdAmnt = c.Element(xn + "mgnSprdAmnt").Value,
            mgnAddlAmnt = c.Element(xn + "mgnAddlAmnt").Value,
            unadjMgnReq = c.Element(xn + "unadjMgnReq").Value
        });
    foreach (var x in myMarginRep)
        Console.WriteLine(x);

打印:

CSLN
+222926.00
+0.00
+0.00
+89349.30
+312275.30

CSLM
+55112.00
+0.00
+0.00
+30854.40
+85966.40

更新:鏈接: http : //rextester.com/UFLPQ70590

您確實需要做JAT在他的帖子中所說的關於將屬性更改為元素的內容,但這不是未從XML創建列表的原因。 這是給您帶來麻煩的名稱空間(“ xmlns =” http://www.123456768.com/technology“),我不確定您的XML文件試圖通過擁有它來完成什么工作,但是如果您刪除它並做什么JAT建議您的IEnumerable將開始被填充。

有關名稱空間的更多信息,您可以從w3中檢出此鏈接: http : //www.w3schools.com/xml/xml_namespaces.asp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM