热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Rust和Serde反序列化XML的困难,其中文档具有可选的子元素

我对Rust还是很陌生,并且仍在尝试使用它。很酷,但是我显然不喜欢自己做的运

我对Rust还是很陌生,并且仍在尝试使用它。很酷,但是我显然不喜欢自己做的运动。作为参考,我使用的是rustc 1.39.0。

我想尝试编写一个简单的程序来从MSBuild的代码分析中读取XML,该代码输出了一些相当简单的XML。我认为的问题是,有一个元素( public static HttpClient getHttpClient()
{
if (_httpClient == null)
{
Uri baseUri = new Uri(Url.baseUrl);
if (baseUri.Scheme == "http")
{
var handler = new HttpClientHandler();
handler.ClientCertificateOptiOns= ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidatiOnCallback=
(httpRequestMessage,cert,cetChain,policyErrors) =>
{
return true;
};
_httpClient = new HttpClient(handler);
}
else
{
_httpClient = new HttpClient();
}
_httpClient.DefaultRequestHeaders.accept.Clear();
_httpClient.DefaultRequestHeaders.accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.BaseAddress = baseUri;
}
return _httpClient;
}
通常为空,但有时可以在其下包含元素。更大的问题是我很讨厌Rust(而且我通常不处理XML),而且我不确定如何正确设置反序列化所需的结构。我正在使用Serde和quick_xml。当我将PATH设置为String并使用在PATH下没有SFA元素的XML时,我的测试成功了。但是一旦我弄清楚该标签是如何被使用并相应地更新我的结构的,我就不断得到错误:

PATH

...即使测试XML文件中的 all 个缺陷在PATH下都具有SFA元素。

我正在处理的所有XML文件如下所示:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Custom("missing field `FILEPATH`")',src\libcore\result.rs:1165:5

在许多情况下,



c:\projects\source\repos\defecttest\defecttest
source.cpp
8
5

26496
The variable 'y' is assigned only once,mark it as const (con.4).
main
main
6




c:\projects\source\repos\defecttest\defecttest
source.cpp
9
5

26496
The variable 'z' is assigned only once,mark it as const (con.4).
main
main
6



为空,但在某些情况下,它包含自己的PATH元素:

SFA

在意识到这一点之前,DEFECT结构中的所有字段都设置为String。假设XML文件中的所有缺陷都没有在PATH下包含子元素,则可以正常工作。当我将其更改为SFA而不是String时,它给了我上面提到的缺少字段错误。我正在测试的代码示例:

main.rs



c:\projects\source\repos\defecttest\defecttest
source.cpp
9
5

26496
The variable 'z' is assigned only once,mark it as const (con.4).
main
main
6


c:\projects\source\repos\defecttest\defecttest
source.cpp
12
3



Cargo.toml

extern crate quick_xml;
extern crate serde;
use std::default::Default;
use std::env;
use std::vec::Vec;
use quick_xml::de::from_str;
use serde::{Serialize,Deserialize};
/*
* Structs for the defect XML
*/
#[derive(Serialize,Deserialize,Debug)]
#[allow(non_snake_case)]
pub struct DEFECTS {
#[serde(rename = "DEFECT",default)]
pub defects: Vec,}
#[derive(Default,Serialize,Debug)]
#[allow(non_snake_case)]
pub struct DEFECT {
#[serde(default)]
pub SFA: SFA,pub DEFECTCODE: String,pub DESCRIPTION: String,pub FUNCTION: String,pub DECORATED: String,pub FUNCLINE: String,#[serde(default)]
pub PATH: Vec,Debug)]
#[allow(non_snake_case)]
pub struct SFA {
pub FILEPATH: String,pub FILENAME: String,pub LINE: String,pub COLUMN: String,}
/*
* Main app code
*/
fn main() {
// Expect the path to the XML file to be passed as the first and only argument
let args: Vec = env::args().collect();
if args.len() != 2 {
panic!("Invalid argument count. Specify a single file to process.");
}
let processing_file = &args[1];
println!("Will attempt to process file: '{}'",&processing_file);
// Try to load the contents of the file
let file_content : String = match std::fs::read_to_string(&processing_file) {
Ok(file_content) => file_content,Err(e) => {
panic!("Failed to read file: '{}' -- {}",&processing_file,e);
}
};
// Now,try to deserialize the XML we have in file_content
let defect_list : DEFECTS = from_str(&file_content).unwrap();
// Assuming the unwrap above didn't blow up,we should get a count here
println!("Retrieved {} defects from file '{}'",defect_list.defects.len(),&processing_file);
}

示例输出

[package]
name = "rust_xml_test"
version = "0.1.0"
authors = ["fny82"]
edition = "2018"
[dependencies]
quick-xml = { version = "0.17",features = [ "serialize" ] }
serde = { version = "1.0",features = [ "derive" ] }

我确定自己做的事情很愚蠢,部分原因可能是我在挑战的范围和我目前对Rust的理解水平方面处于领先地位。谁能帮我弄清楚我的缺失和做错了什么?

有些相关:从那时起,我了解到可以使用C:\Development\RustXmlTest>cargo run -- "c:\development\rustxmltest\test3.xml"
Compiling rust_xml_test v0.1.0 (C:\Development\RustXmlTest)
Finished dev [unoptimized + debuginfo] target(s) in 1.56s
Running `target\debug\rust_xml_test.exe c:\development\rustxmltest\test3.xml`
Will attempt to process file: 'c:\development\rustxmltest\test3.xml'
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Custom("missing field `FILEPATH`")',src\libcore\result.rs:1165:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: process didn't exit successfully: `target\debug\rust_xml_test.exe c:\development\rustxmltest\test3.xml` (exit code: 101)
属性来使我的结构符合Rust的命名约定,但是到目前为止,直到我了解了这一点,我才不想再搞砸了基础功能正常工作。

----编辑----

供参考,通过@edwardw的更正,现在可以运行的代码:

rename

示例:

extern crate quick_xml;
extern crate serde;
use std::default::Default;
use std::env;
use std::vec::Vec;
use quick_xml::de::from_str;
use serde::{Serialize,pub PATH: PATH,Debug)]
#[allow(non_snake_case)]
pub struct PATH {
pub SFA: Option,&processing_file);
}

其中test1.xml包含:

C:\Development\RustXmlTest>cargo run -- "c:\development\rustxmltest\test1.xml"
Compiling rust_xml_test v0.1.0 (C:\Development\RustXmlTest)
Finished dev [unoptimized + debuginfo] target(s) in 1.66s
Running `target\debug\rust_xml_test.exe c:\development\rustxmltest\test1.xml`
Will attempt to process file: 'c:\development\rustxmltest\test1.xml'
Retrieved 2 defects from file 'c:\development\rustxmltest\test1.xml'


PATH本身应建模为具有一个可选字段的结构。这有效:

#[derive(Default,Serialize,Deserialize,Debug)]
#[allow(non_snake_case)]
pub struct DEFECT {
#[serde(default)]
pub SFA: SFA,pub DEFECTCODE: String,pub DESCRIPTION: String,pub FUNCTION: String,pub DECORATED: String,pub FUNCLINE: String,pub PATH: PATH,}
#[derive(Default,Debug)]
#[allow(non_snake_case)]
pub struct PATH {
SFA: Option,}

推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
author-avatar
我是一颗菠菜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有