如何从C#中的xml字符串中获取节点值?

时间:2019-06-28 12:09:29

标签: c# xml

对于以下字符串xml值,我需要获取节点“ ReturnStr”的值

<ArrayOfAppExportReturnStruct
 xmlns=\"http://schemas.datacontract.org/2004/07/ClientWebService\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n 
 <AppExportReturnStruct>\r\n    
 <Key1>0</Key1>\r\n    <Key2>0</Key2>\r\n  
 <PeriodDT>2019-02-26T00:00:00</PeriodDT>\r\n   
 <ReturnCode>1</ReturnCode>\r\n    
 <ReturnStr>Failure - No Deal found based on input parameters passed.</ReturnStr>\r\n  
 </AppExportReturnStruct>\r\n
</ArrayOfAppExportReturnStruct>

我使用了以下代码

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString.Replace("\r\n",""));
string alarmDesc;

string xpath = "ArrayOfAppExportReturnStruct/AppExportReturnStruct";
var nodes = xmlDoc.SelectNodes(xpath);
foreach (XmlNode childrenNode in nodes)
{
    alarmDesc = childrenNode.SelectSingleNode("ReturnStr").InnerText;
}

我在节点var中什么也没得到。 在“ alarmDesc”中获取ReturnStr的节点值的正确方法是什么。

2 个答案:

答案 0 :(得分:4)

XML文本很可能实际上不包含\r\n或任何其他转义字符,这就是Visual Studio在调试时选择表示字符串的方式。解析XML也不依赖于空格,因此几乎肯定没有必要替换这些字符串。要选择节点,您需要包括名称空间。我建议您使用XElement而不是XmlDocument,因为它有一个更加友好的界面:

var xml = XElement.Parse(xmlDocument);
XNamespace ns = "http://schemas.datacontract.org/2004/07/ClientWebService";
var alarmDesc = (string) xml.Element(ns + "AppExportReturnStruct").Element(ns + "ReturnStr");

对于多于元素,请在.Elements循环中使用.Element而不是foreach。如果您只对特定位感兴趣,甚至可以使用LINQ:

var alarmDescriptions = xml
    .Elements(ns + "AppExportReturnStruct")
    .Select(e => (string) e.Element(ns + "ReturnStr"));

答案 1 :(得分:0)

如果只有一个循环,则可以简单地执行此操作。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString.Replace("\r\n",""));
string alarmDesc = xmlDoc.GetElementsByTagName("ReturnStr").Item(0).InnerText;