我正在下载一些CSV数据作为API响应的一部分,并且CSV数据的最后一列包含一个XML代码段,如下所示:
<tns:Event xmlns:tns="http://someurl">
<tns:MaximumSeverity.Code>Error</tns:MaximumSeverity.Code>
<tns:EventItems>
<tns:EventItem>
<tns:Error.Code>ERRORCODE</tns:Error.Code>
<tns:Severity.Code>Error</tns:Severity.Code>
<tns:Short.Description>Short error</tns:Short.Description>
<tns:Detailed.Description>Longer error</tns:Detailed.Description>
<tns:Parameters></tns:Parameters>
</tns:EventItem>
</tns:EventItems>
</tns:Event>
我想从简短描述或详细描述中提取文本,所以我想知道最有效的方法是什么?
XML中可能有多个EventItem元素。
我尝试了下面的代码,但遇到了XPathException:
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
XmlNodeList nodeList = doc.SelectNodes("/tns:Event");
foreach (XmlNode node in nodeList)
{
string errorTxt = node.SelectSingleNode("Short.Description").InnerText;
Console.WriteLine(errorTxt);
}
Console.ReadKey();
答案 0 :(得分:0)
使用XDocument
类比XmlDocument
容易得多,并且您需要处理xml名称空间。
类似这样的东西
using System.Xml.Linq;
XDocument xDoc = XDocument.Parse(xml); //xml is the string you pasted
XNamespace tns = "http://someurl";
var eventItems = xDoc.Element(tns + "Event").Element(tns + "EventItems").Elements(tns + "EventItem");
foreach (var eventItem in eventItems)
{
Console.WriteLine(eventItem.Element(tns + "Short.Description").Value);
Console.WriteLine(eventItem.Element(tns + "Detailed.Description").Value);
}
答案 1 :(得分:0)
我尝试了@kennyzx的代码及其工作方式
string xml = @"<tns:Event xmlns:tns=""http://someurl""><tns:MaximumSeverity.Code>Error</tns:MaximumSeverity.Code><tns:EventItems><tns:EventItem><tns:Error.Code>ERRORCODE</tns:Error.Code>
<tns:Severity.Code>Error</tns:Severity.Code>
<tns:Short.Description>Short error1</tns:Short.Description>
<tns:Detailed.Description>Longer error2</tns:Detailed.Description>
<tns:Parameters></tns:Parameters>
</tns:EventItem>
<tns:EventItem><tns:Error.Code>ERRORCODE</tns:Error.Code>
<tns:Severity.Code>Error</tns:Severity.Code>
<tns:Short.Description>Short error2</tns:Short.Description>
<tns:Detailed.Description>Longer error2</tns:Detailed.Description>
<tns:Parameters></tns:Parameters>
</tns:EventItem>
</tns:EventItems>
</tns:Event>";
XDocument xDoc = XDocument.Parse(xml);
XNamespace tns = "http://someurl";
var eventItems = xDoc.Element(tns + "Event").Element(tns + "EventItems").Elements(tns + "EventItem");
foreach (var eventItem in eventItems)
{
Console.WriteLine(eventItem.Element(tns + "Short.Description").Value);
Console.WriteLine(eventItem.Element(tns + "Detailed.Description").Value);
}