使用 LINQ to XML 解析 XML?
Parse XML using LINQ to XML?
我尝试使用 Linq 在 C# 中解析 XML。
这是我正在解析的 XML:
<Credit>
<LoanApp>
<LoanAppRq PaymentCall="True" Personal="True" Type="Finance">
<Applicant>
<Personal>
<Individuals>
<Individual Type="Applicant">
<GivenName>
<FirstName>test</FirstName>
<LastName>tester</LastName>
</GivenName>
<ContactInfo>
<Address Type="Current">
<StreetNumber>6</StreetNumber>
<StreetName>alton AVE</StreetName>
<City>PHILADELPHIA</City>
<State>PA</State>
<Zip>19142</Zip>
<TimeAtLocation>
<Year>6</Year>
<Month>0</Month>
</TimeAtLocation>
</Address>
<Address Type="Previous">
<StreetNumber>83</StreetNumber>
<StreetName>Main Street</StreetName>
<StreetExtra>12</StreetExtra>
<City>Irvine</City>
<State>CA</State>
<Zip>92695</Zip>
<Country>USA</Country>
<TimeAtLocation>
<Year/>
<Month>3</Month>
</TimeAtLocation>
</Address>
</ContactInfo>
这是我解析它的代码:
parsed_xml.LoadXml(dto.xml);
XElement xelement = XElement.Load(stream);
IEnumerable<XElement> Credit = xelement.Elements();
foreach (var item in Credit)
{
dt.BORROWERFIRSTNAME = item.Element("LoanApp").Element("LoanAppRq").Element("Applicant").Element("Personal").Element("Individuals").Element("Individual").Element("GivenName").Element("FirstName").Value;
dt.BORROWERLASTNAME= item.Element("LoanApp").Element("LoanAppRq").Element("Applicant").Element("Personal").Element("Individuals").Element("Individual").Element("GivenName").Element("LastName").Value;
}
这段代码给我名字和姓氏。
- 首先我想知道这是否是正确的解析方式?
- 第二,如果我想获取当前或以前的地址,我该如何获取它们?另外,在某些情况下,以前的地址可能不存在。
我已经使用这个网站作为学习的参考。
改用Descendant()
和Descendants()
foreach (var item in Credit)
{
dt.BORROWERFIRSTNAME = item.Descendant("FirstName").Value;
dt.BORROWERLASTNAME= item.Descendant("LastName").Value;
}
对于像您这样没有复杂命名空间的深层 XML 层次结构,我更喜欢 System.Xml.XPath
命名空间中的 XPathSelectElements
。
假设您的 xelement
元素与问题中显示的 XML 完全相同,您可以:
foreach (var individual in xelement.XPathSelectElements("LoanApp/LoanAppRq/Applicant/Personal/Individuals/Individual"))
{
// Get the first and last name.
var BORROWERFIRSTNAME = (string)individual.XPathSelectElement("GivenName/FirstName");
var BORROWERLASTNAME = (string)individual.XPathSelectElement("GivenName/LastName");
// Get the XElement for the current address.
var currentAddress = individual.XPathSelectElements("ContactInfo/Address[@Type='Current']")
.FirstOrDefault();
// Extract its properties, checking for a missing current address if necessary.
var currentZip = (currentAddress == null ? null : (string)currentAddress.Element("Zip"));
// Get the XElement for the previous address.
var previousAddress = individual.XPathSelectElements("ContactInfo/Address[@Type='Previous']")
.FirstOrDefault();
// Extract its properties, checking for a missing previous address if necessary.
var previousZip = (previousAddress == null ? null : (string)previousAddress.Element("Zip"));
// Process the borrower names and addresses as required.
}
在纯 Linq 中 XML 的等价物是:
foreach (var individual in xelement.Elements("LoanApp")
.Elements("LoanAppRq")
.Elements("Applicant")
.Elements("Personal")
.Elements("Individuals")
.Elements("Individual"))
{
// Get the first and last name.
var BORROWERFIRSTNAME = (string)individual.Elements("GivenName")
.Elements("FirstName")
.FirstOrDefault();
var BORROWERLASTNAME = (string)individual.Elements("GivenName")
.Elements("LastName")
.FirstOrDefault();
// Get the XElement for the current address.
var currentAddress = individual.Elements("ContactInfo").Elements("Address").Where(e => (string)e.Attribute("Type") == "Current").FirstOrDefault();
// Extract its properties, checking for a missing current address if necessary.
var currentZip = (currentAddress == null ? null : (string)currentAddress.Element("Zip"));
// Get the XElement for the previous address.
var previousAddress = individual.Elements("ContactInfo").Elements("Address").Where(e => (string)e.Attribute("Type") == "Previous").FirstOrDefault();
// Extract its properties, checking for a missing previous address if necessary.
var previousZip = (previousAddress == null ? null : (string)previousAddress.Element("Zip"));
// Process the borrower names and addresses as required.
}
如您所见,它看起来有点复杂。
我尝试使用 Linq 在 C# 中解析 XML。
这是我正在解析的 XML:
<Credit>
<LoanApp>
<LoanAppRq PaymentCall="True" Personal="True" Type="Finance">
<Applicant>
<Personal>
<Individuals>
<Individual Type="Applicant">
<GivenName>
<FirstName>test</FirstName>
<LastName>tester</LastName>
</GivenName>
<ContactInfo>
<Address Type="Current">
<StreetNumber>6</StreetNumber>
<StreetName>alton AVE</StreetName>
<City>PHILADELPHIA</City>
<State>PA</State>
<Zip>19142</Zip>
<TimeAtLocation>
<Year>6</Year>
<Month>0</Month>
</TimeAtLocation>
</Address>
<Address Type="Previous">
<StreetNumber>83</StreetNumber>
<StreetName>Main Street</StreetName>
<StreetExtra>12</StreetExtra>
<City>Irvine</City>
<State>CA</State>
<Zip>92695</Zip>
<Country>USA</Country>
<TimeAtLocation>
<Year/>
<Month>3</Month>
</TimeAtLocation>
</Address>
</ContactInfo>
这是我解析它的代码:
parsed_xml.LoadXml(dto.xml);
XElement xelement = XElement.Load(stream);
IEnumerable<XElement> Credit = xelement.Elements();
foreach (var item in Credit)
{
dt.BORROWERFIRSTNAME = item.Element("LoanApp").Element("LoanAppRq").Element("Applicant").Element("Personal").Element("Individuals").Element("Individual").Element("GivenName").Element("FirstName").Value;
dt.BORROWERLASTNAME= item.Element("LoanApp").Element("LoanAppRq").Element("Applicant").Element("Personal").Element("Individuals").Element("Individual").Element("GivenName").Element("LastName").Value;
}
这段代码给我名字和姓氏。
- 首先我想知道这是否是正确的解析方式?
- 第二,如果我想获取当前或以前的地址,我该如何获取它们?另外,在某些情况下,以前的地址可能不存在。
我已经使用这个网站作为学习的参考。
改用Descendant()
和Descendants()
foreach (var item in Credit)
{
dt.BORROWERFIRSTNAME = item.Descendant("FirstName").Value;
dt.BORROWERLASTNAME= item.Descendant("LastName").Value;
}
对于像您这样没有复杂命名空间的深层 XML 层次结构,我更喜欢 System.Xml.XPath
命名空间中的 XPathSelectElements
。
假设您的 xelement
元素与问题中显示的 XML 完全相同,您可以:
foreach (var individual in xelement.XPathSelectElements("LoanApp/LoanAppRq/Applicant/Personal/Individuals/Individual"))
{
// Get the first and last name.
var BORROWERFIRSTNAME = (string)individual.XPathSelectElement("GivenName/FirstName");
var BORROWERLASTNAME = (string)individual.XPathSelectElement("GivenName/LastName");
// Get the XElement for the current address.
var currentAddress = individual.XPathSelectElements("ContactInfo/Address[@Type='Current']")
.FirstOrDefault();
// Extract its properties, checking for a missing current address if necessary.
var currentZip = (currentAddress == null ? null : (string)currentAddress.Element("Zip"));
// Get the XElement for the previous address.
var previousAddress = individual.XPathSelectElements("ContactInfo/Address[@Type='Previous']")
.FirstOrDefault();
// Extract its properties, checking for a missing previous address if necessary.
var previousZip = (previousAddress == null ? null : (string)previousAddress.Element("Zip"));
// Process the borrower names and addresses as required.
}
在纯 Linq 中 XML 的等价物是:
foreach (var individual in xelement.Elements("LoanApp")
.Elements("LoanAppRq")
.Elements("Applicant")
.Elements("Personal")
.Elements("Individuals")
.Elements("Individual"))
{
// Get the first and last name.
var BORROWERFIRSTNAME = (string)individual.Elements("GivenName")
.Elements("FirstName")
.FirstOrDefault();
var BORROWERLASTNAME = (string)individual.Elements("GivenName")
.Elements("LastName")
.FirstOrDefault();
// Get the XElement for the current address.
var currentAddress = individual.Elements("ContactInfo").Elements("Address").Where(e => (string)e.Attribute("Type") == "Current").FirstOrDefault();
// Extract its properties, checking for a missing current address if necessary.
var currentZip = (currentAddress == null ? null : (string)currentAddress.Element("Zip"));
// Get the XElement for the previous address.
var previousAddress = individual.Elements("ContactInfo").Elements("Address").Where(e => (string)e.Attribute("Type") == "Previous").FirstOrDefault();
// Extract its properties, checking for a missing previous address if necessary.
var previousZip = (previousAddress == null ? null : (string)previousAddress.Element("Zip"));
// Process the borrower names and addresses as required.
}
如您所见,它看起来有点复杂。