我有一个从报告生成的原始XML文件。 XML的格式非常复杂。我尝试做的目标是通过此xml并在ObjectName
的每个节点内获取FormattedValue
和<FormattedAreaPair Level="2" Type="Details">
的值:
<FormattedReport xmlns="urn:crystal-reports:schemas"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
<FormattedAreaPair Level="0" Type="Report">
<FormattedAreaPair Level="1" Type="Group">
<FormattedAreaPair Level="2" Type="Details">
<FormattedArea Type="Details">
<FormattedSections>
<FormattedSection SectionNumber="0">
<FormattedReportObjects>
<FormattedReportObject xsi:type="CTFormattedField"
Type="xsd:string"
FieldName="{ado.agent_extension}">
<ObjectName>Field2</ObjectName>
<FormattedValue>3531</FormattedValue>
<Value>3531</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField"
Type="xsd:string"
FieldName="{ado.agent_state}">
<ObjectName>Field4</ObjectName>
<FormattedValue>Logged-in</FormattedValue>
<Value>Logged-in</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField"
Type="xsd:short"
FieldName="{ado.reason_code}">
<ObjectName>Field5</ObjectName>
<FormattedValue>0</FormattedValue>
<Value>0.00</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField"
Type="xsd:string"
FieldName="{@tf_duration}">
<ObjectName>Field7</ObjectName>
<FormattedValue>0:00:00</FormattedValue>
<Value>0:00:00</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField"
Type="xsd:string"
FieldName="{@tf_Agent_ID}">
<ObjectName>TemplateField11</ObjectName>
<FormattedValue>Users_Name</FormattedValue>
<Value>Users_Name</Value>
</FormattedReportObject>
<FormattedReportObject xsi:type="CTFormattedField"
Type="xsd:timeInstant"
FieldName="{@tf_Transition_Time}">
<ObjectName>TemplateField21</ObjectName>
<FormattedValue>6/1/2015 6:43:31AM</FormattedValue>
<Value>2015-06-01T06:43:31</Value>
</FormattedReportObject>
</FormattedReportObjects>
</FormattedSection>
</FormattedSections>
</FormattedArea>
</FormattedAreaPair>
我尝试了几种不同的方法(我非常喜欢阅读XML)。
使用System.XML: - 找不到数据
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\TEST\Reports\Test.xml");
XmlNode node = xmlDoc.DocumentElement.FirstChild;
XmlNodeList lstFields = node.ChildNodes;
for(int i = 0; i <lstFields.Count; i++)
{
//look for Node
if (lstFields[i].Name == "FormattedSections")
{
XmlNodeList lstCrap = lstFields[i].ChildNodes;
for (int j = 0; j < lstCrap.Count; j++)
{
txtTest.Text += lstCrap[j].InnerText + "\n";
}
}
}
使用system.xml.linq:
private string pullValue (string productID)
{
XDocument xdoc = XDocument.Load(@"C:\TEST\Reports\Test.xml");
var detailsTest = xdoc
.Descendants("FormattedReportObjects")
.Where(extension => extension.Descendants("FormattedReportObject")
.Any(number => (string)number.Attribute("Value")
== productID)).FirstOrDefault();
return (string)detailsTest;
}
答案 0 :(得分:1)
有什么问题?这很简单!
XElement report = XElement.Load("file.xml");
XNamespace ns = "urn:crystal-reports:schemas";
var formattedAreaPair = report
.Descendants(ns + "FormattedAreaPair")
.Where(elem => elem.Attribute("Level").Value == "2" && elem.Attribute("Type").Value == "Details")
.First();
foreach (var elem in formattedAreaPair.Descendants(ns + "FormattedReportObject"))
{
Console.WriteLine(elem.Element(ns + "ObjectName").Value);
Console.WriteLine(elem.Element(ns + "FormattedValue").Value);
Console.WriteLine();
}