簡體   English   中英

LINQ-to-XML:找到第一個安全性

[英]LINQ-to-XML: Find the first security

我正在嘗試優化查詢,以僅獲取活躍的公司,而不獲取“ DEBT”。 公司。 另外,我只需要第一個安全性的數據。 我的XML字符串如下所示:

<DataFeed FeedName="AdminData">
  <Issuer>
    <id>579</id>
    <name>Microsoft</name>
    <symbol>MSFT-NSDQ</symbol>
    <active>1</active>
    <shortName>FirstService</shortName>
    <clientCode>MSFT=US</clientCode>
    <hide>0</hide>
    <securities>
      <Security>
        <id>579</id>
        <rank>0</rank>
        <pricingSymbol>MSFT-NSDQ</pricingSymbol>
        <displaySymbol>MSFT</displaySymbol>
        <active>1</active>
        <clientCode>MSFT=US</clientCode>
        <coverage>
          <Coverage>
            <analyst id="101" clientCode="BG" firstName="Bill" lastName="Gates" rank="1"/>
          </Coverage>
        </coverage>
        <customFields>
          <customField name="ADP Security Code" type="Textbox">
            <values>
              <value>F020941</value>
            </values>
          </customField>
        </customFields>
      </Security>
      <Security>
        <id>581</id>
        <rank>1</rank>
        <pricingSymbol>MSFT-TSX</pricingSymbol>
        <displaySymbol>MSFT-TSX</displaySymbol>
        <active>1</active>
        <clientCode>MSFT=US</clientCode>
        <customFields>
          <customField name="ADP Security Code" type="Textbox">
            <values>
              <value>F020941</value>
            </values>
          </customField>
        </customFields>
      </Security>
    </securities>
  </Issuer>
  <Issuer>
    <id>558</id>
    <name>Apple</name>
    <symbol>AAPL-NYSE</symbol>
    <active>1</active>
    <clientCode>AAPL=US</clientCode>
    <hide>0</hide>
    <securities>
      <Security>
        <firmId>18524</firmId>
        <id>558</id>
        <rank>0</rank>
        <pricingSymbol>AAPL-NYSE</pricingSymbol>
        <displaySymbol>AAPL</displaySymbol>
        <active>1</active>
        <clientCode>AAPL=US</clientCode>
        <coverage>
          <Coverage>
            <analyst id="129" clientCode="SJ" firstName="Steve" lastName="Jobs" rank="1"/>
          </Coverage>
        </coverage>
        <customFields>
          <customField name="ADP Security Code" type="Textbox">
            <values>
              <value>F106997</value>
            </values>
          </customField>
        </customFields>
      </Security>
    </securities>
  </Issuer>
  <Issuer>
    <id>612</id>
    <name>Tesla</name>
    <symbol>DEBT.TSLA</symbol>
    <active>1</active>
    <clientCode>DEBT.TSLA</clientCode>
    <hide>0</hide>
    <securities>
      <Security>
        <id>613</id>
        <rank>0</rank>
        <pricingSymbol>TSLA-NYSE</pricingSymbol>
        <displaySymbol>TSLA</displaySymbol>
        <active>1</active>
        <clientCode>DEBT.TSLA</clientCode>
        <coverage>
          <Coverage>
            <analyst id="101" clientCode="EM" firstName="Elon" lastName="Musk" rank="1"/>
          </Coverage>
        </coverage>
        <customFields>
          <customField name="ADP Security Code" type="Textbox">
            <values>
              <value>G002869</value>
            </values>
          </customField>
        </customFields>
      </Security>
    </securities>
  </Issuer>
</DataFeed>

到目前為止,這是我的查詢內容:

var xDoc = XDocument.Parse(xmlString)
.Descendants("Issuer")
.Where(xd => (int?)xd.Element("active") == 1 && (int?)xd.Element("hide") == 0 && 
    !xd.Element("clientCode").ToString().StartsWith("DEBT.")
    )
.Select(xd => new { 
    Ticker = xd.Element("clientCode").Value,
    Symbol = xd.Element("symbol").Value,
    DisplaySymbol = xd.Element("displaySymbol").Value,
    AnalystFName = xd.Element("Analyst").Attribute("firstName").Value,
    CompanyName = xd.Element("name").Value,
    ADP = xd. <-- not sure what to do here
});

我收到以下錯誤:

NullReferenceException: Object reference not set to an instance of an object.

我認為問題在於我似乎無法僅獲得第一安全性。 如何僅獲得第一安全性所需的信息。 另外,如何獲得ADP代碼? 我很難嘗試為此找到代碼。 最后,我試圖獲得以下結果:

在此處輸入圖片說明

Element僅獲取直接子元素,此處某些點需要Descendants

您可能可以通過一些漂亮的方式將其重構為較小的可組合塊,但這將在示例文件上完成工作:

var rows =
    from issuer in doc.Descendants("Issuer")
    let ticker = (string) issuer.Element("clientCode")
    let symbol = (string) issuer.Element("symbol")
    where (int?) issuer.Element("active") == 1 &&
          (int?) issuer.Element("hide") == 0 && !ticker.StartsWith("DEBT.")
    from security in issuer.Descendants("Security").Take(1)
    from analyst in security.Descendants("analyst")
    from adpField in security.Descendants("customField")
    where (string) adpField.Attribute("name") == "ADP Security Code"
    select new
    {
        Ticker = ticker,
        Symbol = symbol,
        DisplaySymbol = (string) security.Element("displaySymbol"),
        AnalystFName = (string) analyst.Attribute("firstName"),
        AnalystLName = (string) analyst.Attribute("lastName"),
        ADP = adpField.Value
    };

請參閱此小提琴以獲得有效的演示。

暫無
暫無

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

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