我有一個非常大的XML文件。這是xml格式的簡化版本。XmlReader不斷讀取
<?xml version='1.0' encoding='UTF-8'?>
<Sender>
<SenderID>571099948</SenderID>
<Sponsors>
<Sponsor>
<SponsorID>TEST01</SponsorID>
<Contracts>
<Contract>
<ContractID>000001</ContractID>
<Member>
<SSN>1111111111</SSN>
<Gender>M</Gender>
<Benefits>
<Benefit BenefitType="AAA">
</Benefit>
<Benefit BenefitType="BBB">
</Benefit>
</Benefits>
</Member>
<Member>
<SSN>4444444444</SSN>
<Gender>F</Gender>
<Benefits>
<Benefit BenefitType="AAA">
</Benefit>
</Benefits>
</Member>
</Contract>
<Contract>
<ContractID>0000002</ContractID>
<Member>
<SSN>2222222222</SSN>
<Gender>F</Gender>
<Benefits>
<Benefit BenefitType="CCC">
</Benefit>
<Benefit BenefitType="DDD">
</Benefit>
</Benefits>
</Member>
</Contract>
<Contract>
<ContractID>0000003</ContractID>
<Member>
<SSN>333333333</SSN>
<Gender>F</Gender>
<Benefits>
<Benefit BenefitType="CCC">
</Benefit>
</Benefits>
</Member>
</Contract>
</Contracts>
</Sponsor>
<Sponsor>
<SponsorID>TEST02</SponsorID>
<Contracts>
<Contract>
<ContractID>0000011</ContractID>
<Member>
<SSN>1111111111</SSN>
<Gender>M</Gender>
<Benefits>
</Benefits>
</Member>
</Contract>
<Contract>
<ContractID>0000002</ContractID>
<Member>
<SSN>2222222222</SSN>
<Gender>F</Gender>
<Benefits>
</Benefits>
</Member>
</Contract>
</Contracts>
</Sponsor>
</Sponsors>
</Sender>
我想要從父節點獲取合約節點以及SponsorID的所有信息。以下是使用XmlReader部分讀取xml文件的代碼:
static IEnumerable<XElement> SimpleStreamAxis(string inputUrl, string elementName)
{
using (XmlReader reader = XmlReader.Create(inputUrl))
{
reader.MoveToContent();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == elementName)
{
XElement el = XNode.ReadFrom(reader) as XElement;
if (el != null)
{
yield return el;
}
}
}
}
}
}
這是問題所在。我無法使用它,因爲整個贊助商樹可能對記憶太大。
var sponsor = SimpleStreamAxis(file, "Sponsor");
我也不能使用這個,因爲我不能告訴SponsorID只有合約節點的信息。
var contract = SimpleStreamAxis(file, "Contract");
有沒有我可以在贊助閱讀SponsorID,向前移動光標,並讀取此贊助下的所有合同節點的方式,然後移動到下一個贊助商和閱讀SponsorID及其合同節點等等?
謝謝!使用字典保留sponsorID的問題是,當sponsorID更改時,它總是會產生額外的回報,新的sponsorID和舊的Contract。 – seattleSummer
@seattleSummer - 答案已更新,以解決您發現的問題。刪除字典實際上使它更簡單。 – dbc
我沒有看到使用這個循環的重點。 foreach(var SubReader在StreamNamedSubtrees(reader,new [] {(XName)「Sponsor」})) – seattleSummer