如何使用 XPath 在 C# 中提取 XML 节点
本文关键字:提取 XML 节点 何使用 XPath | 更新日期: 2023-09-27 18:35:17
从下面的GeoCodeRespose xml中,我们如何在C#程序中使用xpath提取位置,路线和街道编号的值。
<GeocodeResponse>
<status>OK</status>
<result>
<type>street_address</type>
<formatted_address>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</formatted_address>
<address_component>
<long_name>1600</long_name>
<short_name>1600</short_name>
<type>street_number</type>
</address_component>
<address_component>
<long_name>Amphitheatre Pkwy</long_name>
<short_name>Amphitheatre Pkwy</short_name>
<type>route</type>
</address_component>
<address_component>
<long_name>Mountain View</long_name>
<short_name>Mountain View</short_name>
<type>locality</type>
<type>political</type>
</address_component>
</result>
</GeocodeResponse>
到目前为止,我可以在xml文档中获取xml,并且可以获取格式化地址的值,如下所示
XmlDocument doc=GetGeoCodeXMLResponse();
XPathDocument document = new XPathDocument(new XmlNodeReader(doc));
XPathNavigator navigator = document.CreateNavigator();
XPathNodeIterator resultIterator = navigator.Select("/GeocodeResponse/result");
while (resultIterator.MoveNext())
{
XPathNodeIterator formattedAddressIterator = resultIterator.Current.Select("formatted_address");
while (formattedAddressIterator.MoveNext())
{
string FullAddress = formattedAddressIterator.Current.Value;
}
}
如果您的 XML 是一致的,这可能是最简单的方法。
创建一个表示 XML 的对象:
public GeocodeResponse
{
public string Status { get; set; }
public Result Result { get; set; }
public class Result
{
public string type { get; set; }
public string formatted_address { get; set; }
// etc..
}
}
在 XML 中反序列化对象。
var serializer = new XmlSerializer(typeof(GeocodeResponse));
GeocodeResponse geocodeReponse =
(GeocodeResponse)serializer.Deserialize(xmlAsString);
您可以使用 LinqToXml
,试试这个,您将获得一个匿名类型,其中包含您需要的所有属性。
var xDoc = XDocument.Parse(xmlString);
var result = xDoc.Descendants("result").Select(c =>
new
{
FormattedAddress = c.Element("formatted_address").Value,
StreetNumber = c.Descendants("address_component")
.First(e => e.Element("type").Value == "street_number").Element("short_name").Value,
Route = c.Descendants("address_component")
.First(e => e.Element("type").Value == "route").Element("short_name").Value,
Locality = c.Descendants("address_component")
.First(e => e.Element("type").Value == "locality").Element("short_name").Value
}).First();