[英]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.