对于以下字符串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的节点值的正确方法是什么。
答案 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;