简体   繁体   English

如何使用LINQ to XML解析嵌套元素

[英]How to parse nested elements using LINQ to XML

I have an XML file with multiple checkItem elements. 我有一个带有多个checkItem元素的XML文件。 I need to save each checkItem element into a database. 我需要将每个checkItem元素保存到数据库中。 I'm having a difficult time getting exactly what I need using the query below. 我在使用下面的查询来获取所需的信息时遇到了困难。

<checkItem>
    <checkItemType>check</checkItemType>
    <checkAmount>195000</checkAmount>
    <nonMICRCheckData>
      <legalAmount>195000</legalAmount>
      <issueDate>2010-04-30</issueDate>
      <other>PAY VAL 20 CHARACTER</other>
    </nonMICRCheckData>
    <postingInfo>
      <date>2013-05-01</date>
      <RT>10108929</RT>
      <accountNumber>111111111</accountNumber>
      <seqNum>11111111</seqNum>
      <trancode>111111</trancode>
      <amount>195000</amount>
      <serialNumber>1111111</serialNumber>
    </postingInfo>
    <totalImageViewsDelivered>2</totalImageViewsDelivered>
    <imageView>
      <imageIndicator>Actual Item Image Present</imageIndicator>
      <imageViewInfo>
        <Format>
          <Baseline>TIF</Baseline>
        </Format>
        <Compression>
          <Baseline>CCITT</Baseline>
        </Compression>
        <ViewSide>Front</ViewSide>
        <imageViewLocator>
          <imageRefKey>201305010090085000316000085703_Front.TIF</imageRefKey>
          <imageFileLocator>IFTDISB20130625132900M041.zip</imageFileLocator>
        </imageViewLocator>
      </imageViewInfo>
      <imageViewInfo>
        <Format>
          <Baseline>TIF</Baseline>
        </Format>
        <Compression>
          <Baseline>CCITT</Baseline>
        </Compression>
        <ViewSide>Rear</ViewSide>
        <imageViewLocator>
          <imageRefKey>201305010090085000316000085703_Rear.TIF</imageRefKey>
          <imageFileLocator>IFTDISB20130625132900M041.zip</imageFileLocator>
        </imageViewLocator>
      </imageViewInfo>
    </imageView>
  </checkItem>

Here is the query I've been working with. 这是我一直在使用的查询。 I've tried several different ways with no luck. 我尝试了几种不同的方法,但都没有碰到运气。 Without the use of .Concat, I cannot get the other elements; 如果不使用.Concat,我将无法获得其他元素。 however, using .Concat does not allow me to get all values in a manageable format. 但是,使用.Concat不允许我以可管理的格式获取所有值。 I need to separate the Front and Rear imageViews based on the ViewSide value, and only need the imageRefKey and imageFileLocator values from the imageView element. 我需要基于ViewSide值将前后imageView分开,并且只需要imageView元素中的imageRefKey和imageFileLocator值。 Can anyone point me in the right direction? 谁能指出我正确的方向?

var query = doc.Descendants("checkItem")
            //.Concat(doc.Descendants("postingInfo"))
            //.Concat(doc.Descendants("imageViewLocator"))//.Where(x => (string)x.Element("ViewSide") == "Front"))
            //.Concat(doc.Descendants("imageViewInfo").Where(x => (string)x.Element("ViewSide") == "Rear"))
            .Select(x => new {
                       CheckAmount = (string) x.Element("checkAmount"),
                       ImageRefKey = (string) x.Element("imageRefKey"),
                       PostingDate = (string) x.Element("dare"),
                       //FrontViewSide = (string) x.Element("ViewSide"),
                       //RearViewSide = (string) x.Element("BViewSide")
                   });

You can easily get nested elements of any XElement by just calling the Elements() method of that instance, then calling Select() on that collection, to created a nested collection of an anonymous type in your main anonymous type. 您只需调用该实例的Elements()方法,然后在该集合上调用Select() ,即可在您的主要匿名类型中创建匿名类型的嵌套集合,从而轻松获取任何XElement的嵌套元素。

var query = doc.Elements("checkItem")
               .Select( x =>
               new 
               {
                   CheckAmount = (string) x.Element("checkAmount"),
                   ImageRefKey = (string) x.Element("imageRefKey"),
                   PostingDate = (string) x.Element("dare"),
                   ImageViews = x.Element("ImageView").Elements("ImageViewInfo")
                       .Select(iv=> 
                       new 
                       {
                          Format = iv.Element("Format").Element("Baseline").Value
                          // more parsing here
                       }
                }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM