我有一个非常大的xml文件。这是xml格式的简化版本。
<?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及其合同节点,依此类推?
发布于 2015-06-27 00:39:42
试试这个:
using (XmlReader xmlReader = XmlReader.Create("file.xml"))
{
while (xmlReader.Read())
{
if (xmlReader.ReadToFollowing("SponsorID"))
{
string sponsorId = xmlReader.ReadElementContentAsString();
// process SponsorID
Console.WriteLine(sponsorId);
if (xmlReader.ReadToFollowing("Contract"))
{
do
{
XmlReader contractSubtree = xmlReader.ReadSubtree();
XElement contractElement = XElement.Load(contractSubtree);
// process Contract
Console.WriteLine(contractElement.Element("ContractID"));
} while (xmlReader.ReadToNextSibling("Contract"));
}
}
}
}
https://stackoverflow.com/questions/31062289
复制相似问题