解析 XML 的更简单方法

Posted

技术标签:

【中文标题】解析 XML 的更简单方法【英文标题】:Simpler way to parse XML 【发布时间】:2021-12-21 01:36:07 【问题描述】:

我有以下从 api 返回的 xml:

<?xml version="1.0" encoding="utf-8"?>
  <response>
   <error>
    <errorcode>1002</errorcode>
    <errortext>there is already an open session</errortext>
   </error>
</response>

我想阅读错误代码。我写了以下代码:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(result1);
XmlNode node = xmlDoc.DocumentElement.SelectSingleNode("/response").ChildNodes[0].ChildNodes[0].InnerText

有没有其他方法可以通过使用 linq 或其他技术来做到这一点?

我使用api调用如下

HttpClientHandler handler = new HttpClientHandler();
HttpClient client = new HttpClient(handler);
var result = client.GetAsync(new Uri("https://api/access.mth?username=xyz&password=xyz@2021)).GetAwaiter().GetResult();
StreamReader reader = new StreamReader(result.Content.ReadAsStringAsync().Result);

【问题讨论】:

更简单消费还是更简单写?答案不会一样。使用其他人建议的序列化将简化代码的使用,但会更难实现。您想简化哪一方面?也就是说,您可以使用此 XPath 简化代码:xmlDoc.DocumentElement.SelectSingleNode("/response/error/errorCode").InnerText 【参考方案1】:

您可以使用位于命名空间 System.Xml.Serialization 中的 XML 序列化程序。根据您的 XML 元素创建一个具有无参数构造函数的类,该构造函数具有带有 getter 和 setter 的公共属性:

public class response

   public error error get;set;


public class error

   public int errorcode get;set;
   public string errortext get;set;

注意:这里的无参构造函数是由编译器隐式创建的,因为根本没有定义构造函数。

您可以通过以下方式加载文件

using StreamReader reader = new StreamReader("file.xml");
XmlSerializer serializer = new XmlSerializer(typeof(response));
var result = (response)serializer.Deserialize(reader);
int errorCode = result.error.errorcode;

您对 XML 文件的格式有一定的灵活性。例如,如果你也有这个文件要解析:

<response>
<returncode>
   <code>100</code>
   <description>successful</description>
</returncode> <authkey>xxxx<authkey>
</response>

你可以修改你的类结构:

public class response

   public error error get;set;
   public returncode returncode get;set;
   public string authkey get;set;


public class error

   public int errorcode get;set;
   public string errortext get;set;


public class returncode

   public int code get;set;
   public string description get;set;

如果您解析第一种格式的文件,returncodeauthkey 将为空。如果解析第二种格式的文件,error 将为空。

【讨论】:

是否可以不创建类?因为我有近 4 个不同数据的 xml 文件 另外,当响应成功时,我将有如下 xml &lt;response&gt; &lt;returncode&gt; &lt;code&gt;100&lt;/code&gt; &lt;description&gt;successful&lt;/description&gt; &lt;/returncode&gt; &lt;authkey&gt;xxxxauthkey&gt; &lt;/response&gt; @Developer 您可能会为多个 xml 文件使用一个类,请参阅我更新的答案。 好的,但是当我试图将它加载到 StreamReader 时,响应是从 api 获得的,我得到了一个像 Illegal characters in path. 这样的异常 如果内存中已有字符串,请尝试使用StringReader 而不是StreamReader

以上是关于解析 XML 的更简单方法的主要内容,如果未能解决你的问题,请参考以下文章

XMl的解析简单的方法

使用 pl/sql dom 解析器解析 XML 的最简单方法

有没有更简单的方法在 Java 中解析 XML?

从 unix 命令行进行基本 xml 解析的最简单方法

调试 Windows 服务的更简单方法

从附加元素获取 jQuery 对象的更简单方法