传递CSV响应中包含的XML数据

时间:2018-09-12 05:24:46

标签: c# xml

我正在下载一些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();

2 个答案:

答案 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);
}

enter image description here