-1

私はC#でLINQtoXMLを使用しています。次のコードがありますが、最後の行でSystem.Exceptionがスローされ続けます。値をnullにすることはできません。何が問題なのかわかりません。私はすべてを試しました。AuthorizedToSignはリストです。かさばるネストされたforeachループを使用して、同じアクションを実行できました。XMLファイル自体に関してはエラーがないことは確かです。誰かが助けてくれるなら、私はそれを大いに感謝します。

BusinessAccounts = (from a in accountRoot.Elements()
where (bool)a.Element("Business") == true
select new BusinessAccount()
{
OpenDate = (DateTime)a.Element("DateOpened"),
Password = a.Element("Password").Value,
Balance = (double)a.Element("Balance"),
AccountStatus = (Status)Enum.Parse(typeof(Status), a.Element("Status").Value),
//Element AuthToSign has a collection of sub-elements called "authName"
//couldn't get the code below to work
AuthorizedToSign = (from el in a.Element("AuthorizedToSign").Elements()
                    select el.Element("AuthName").Value).ToList()
                                }).ToList();

に変更select el.Element("AuthName").Value) して select (string)el.Element("AuthName")) も効果はありません。

XMLファイルには、次のようなエントリが多数あります。

<?xml version="1.0" encoding="utf-8"?>
<Accounts>
  <BusinessAccount>
    <Business>true</Business>
    <AccountNumber>34534456</AccountNumber>
    <AccountBranchID>100</AccountBranchID>
    <AccountName>Elgris Tech</AccountName>
    <CompanyName>Elgris Tech</CompanyName>
    <CompanyID>235</CompanyID>
    <CreditLimit>50000</CreditLimit>
    <DateOpened>2014-12-13T00:00:00</DateOpened>
    <Balance>1200</Balance>
    <Password>1234</Password>
    <Status>Active</Status>
    <AuthorizedToSign>
      <AuthName>Yechiel</AuthName>
      <AuthName>Lev</AuthName>
      <AuthName>Roman</AuthName>
    </AuthorizedToSign>
  </BusinessAccount>
  <PrivateAccount>
    <Business>false</Business>
    <AccountNumber>34534458</AccountNumber>
    <AccountBranchID>100</AccountBranchID>
    <AccountName>Yechiel L.</AccountName>
    <CustomerName>Yechiel L.</CustomerName>
    <CustomerAddress>2sadfasosa, CA</CustomerAddress>
    <CustomerPhone>8-4268</CustomerPhone>
    <CardNumber>304456</CardNumber>
    <CreditLimit>10000</CreditLimit>
    <DateOpened>1994-06-23T00:00:00</DateOpened>
    <Balance>555000</Balance>
    <Password>pass</Password>
    <Status>Active</Status>
  </PrivateAccount>
</Accounts>
4

1 に答える 1

1

アップデート

xmlによると、PrivateAccount要素にはノードがないためAuthorizedToSign、ノードを参照するとAuthorizedToSign例外がスローされます。したがって、あなたの場合の解決策は単純です:

from a in accountRoot.Elements()
let authorized = a.Element("AuthorizedToSign")
where (bool)a.Element("Business")
select new BusinessAccount()
{
    OpenDate = (DateTime)a.Element("DateOpened"),
    Password = (string)a.Element("Password"),
    Balance = (double)a.Element("Balance"),
    AccountStatus = (Status)Enum.Parse(typeof(Status), (string)a.Element("Status")),
    AuthorizedToSign = authorized == null ? null : // or new List<string>()
                       authorized.Elements()
                                 .Select(auth => (string)auth)
                                 .ToList()
};

クエリ構文を使用した認証名の取得:

AuthorizedToSign = authorized == null ? null : // or new List<string>()
                   (from auth in authorized.Elements()
                    select (string)auth).ToList()
于 2013-01-06T21:33:24.790 に答える