Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误

17 篇文章 2 订阅
14 篇文章 0 订阅

前言

WinRiver II 测量项目文件扩展名为 MMT,是声学多普勒流速剖面仪(简称 ADCP )测量软件 WinRiver II 的测量项目文件,是现代水域剖面流量测验的重要技术方法。

一、WinRiver II 测量项目 MMT 文件的结构

WinRiver II 测量项目 MMT 文件的结构实际是 XML 结构,遵循 XML 标准,文件编码是 UTF-8 LE (无 BOM ),文件结构如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<WinRiver>
  <Project Name="bs20240418_1.mmt" Version="1.0.0.2" Flags="0">
    <Locked>False</Locked>
    <Site_Information Type="1" Checked="1" Status="0" Error="0">
      <Agency>长江勘测局</Agency>
      <Country>中国</Country>
      <State>湖北省</State>
      <County>武汉市</County>
      <District>江岸镇</District>
      <HydrologicUnit>长江水文局</HydrologicUnit>
      <Party>江岸分局</Party>
      <BoatMotorUsed>水文668快艇</BoatMotorUsed>
      <ProcessedBy>赵钱孙</ProcessedBy>
      <ADCPSerialNmb>21924</ADCPSerialNmb>
      <Description>江岸村</Description>
      <Grid_Reference>长江</Grid_Reference>
      <Number>61500001</Number>
      <Name>白沙(二)</Name>
      <River_Name>长江干流</River_Name>
      <Measurement_Date>04/18/2024</Measurement_Date>
      <Rating_Number>1</Rating_Number>
      <Wind_Speed>2</Wind_Speed>
      <Wind_Direction>S</Wind_Direction>
      <Edge_Measurement_Method> </Edge_Measurement_Method>
      <Magnetic_Var_Method>模型</Magnetic_Var_Method>
      <Measurement_Rating>(2%)</Measurement_Rating>
      <ControlCode1>4-畅流</ControlCode1>
      <ControlCode2>7-杂物量少</ControlCode2>
      <ControlCode3>9-水生植物量少</ControlCode3>
      <MeasurementNmb>1</MeasurementNmb>
      <Remarks>2S  p8 0.14</Remarks>
      <TimeZone>中国夏令</TimeZone>
      <DeploymentType>0</DeploymentType>
      <Use_Inside_Gage_Height>1</Use_Inside_Gage_Height>
      <Magnetic_Var_Method_Index>1</Magnetic_Var_Method_Index>
      <Measurement_Rating_Index>1</Measurement_Rating_Index>
      <ControlCode1_Index>3</ControlCode1_Index>
      <ControlCode2_Index>6</ControlCode2_Index>
      <ControlCode3_Index>8</ControlCode3_Index>
      <Inside_Gage_Height>30.310000</Inside_Gage_Height>
      <Outside_Gage_Height>0.000000</Outside_Gage_Height>
      <Gage_Height_Change>0.000000</Gage_Height_Change>
      <Rating_Discharge>0.000000</Rating_Discharge>
      <Index_Velocity>0.000000</Index_Velocity>
      <Rated_Area>0.000000</Rated_Area>
      <Water_Temperature>-32768.000000</Water_Temperature>
      <Tail_Water_Level>30.310000</Tail_Water_Level>
      <Reference>BT</Reference>
      <Use_Old_Sidelobe_Method>0</Use_Old_Sidelobe_Method>
    </Site_Information>
    <Site_Discharge Type="2" Checked="1" Status="0" Error="0">
       <!-- 省略...... -->
    </Site_Discharge>
    <QA_QC Type="3" Checked="1" Status="0" Error="0">
       <!-- 省略...... -->
    </QA_QC>
    <Collect_Data Type="4" Checked="1" Status="0" Error="0">
       <!-- 省略...... -->
    </Collect_Data>
    <DisplaySettings>
      <Globals>
        <Depth_Max>15.000000</Depth_Max>
      </Globals>
    </DisplaySettings>
  </Project>
</WinRiver>

二、WinRiver II 无法打开或操作测量项目 MMT 文件

当 WinRiver II 测验完成,进行后处理时,有时候发现无法打开或载入测验项目 MMT 文件。

2.1 无法载入船测多线法测量文件

在这里插入图片描述

2.2 可以载入测验项目 MMT 文件,但 ADCP 后处理软件无法写入信息

在 ADCP 后处理软件进行计算后,无法写入准确的水边距等信息

2.3 无法打开或操作测量项目 MMT 文件的原因

无法打开或操作测量项目 MMT 文件的原因是 MMT 文件写入了违反 XML 规则的字符

A、测验工作时,外围设备 USB 串口接触不良、屏蔽不良
B、测验完成后,WinRiver II 软件没有正常退出
C、测验完成后,WinRiver II 软件没有关闭测量模式进行了违规操作
D、测验完成后,WinRiver II 软件回放数据进行编辑操作时,外围设备 USB 串口没有正常拨出
E、WinRiver II 软件可能存在 UTF-8 中文处理不严谨的 BUG
F、使用记事本的 ANSI 编码打开和编辑了 UTF-8 编码的测量项目 MMT 文件,导致 UTF-8 编码异常

三、符合与违反 XML 文件规则的字符

3.1、符合规则的单字节的英语字母和符号(0-9、a-z、A-Z、±*/<>[]等)

常见数字、字母的十六进制:

字母或符号十六进制
0-9\x30、\x31、\x32、\x33、\x34、\x35、\x36、\x37、\x38、\x39
A-Z\x41、\x42、\x43、\x44、\x45、\x46、\x47、\x48、\x49、\x4A、\x4B、\x4C、\x4D、\x4E、\x4F、\x50 - - - -\x5A
a-z\x61、\x62、\x63、\x64、\x65、\x66、\x67、\x68、\x69、\x6A、\x6B、\x6C、\x6D、\x6E、\x6F、\x70 - - - -\x7A
空格 ! 双引号 “\x20、\x21、\x22
# $ % & ’ ( ) * + , - . /\x23、\x24、\x25、\x26、\x27、\x28、\x29、\x2A、\x2B、\x2C、\x2D、\x2E、\x2F
: ; < = > ? @\x3A、\x3B、\x3C、\x3D、\x3E、\x3F、\x40
[ \ ] ^ _ `\x5B、\x5C、\x5D、\x5E、\x5F、\x60
{ | } ~\x7B、\x7C、\x7D、\x7E
常用控制符十六进制
Tab 制表符\x09
换行符\x0A
回车符\x0D

3.2、符合规则的双字节的阿拉伯字母和符号

3.3、符合规则的三字节的UTF-8 编码字符(UTF-8 编码的汉字或其它区域文字)

3.4、常见违反 XML 规则的非法字符

常见导致 XML 无法正常载入的非法字符,以十六进制表示:

非法字符范围十六进制
\x0-\x8、\x0B-\x0C\x00、\x01、\x02、\x03、\x04、\x05、\x06、\x07、\x08、\x0B、\x0C
\x0E-\x1F\x0E、\x0F、\x10、\x11、\x12、\x13、\x14、\x15、\x16、\x17、\x18、\x19、\x1A、\x1B、\x1C、\x1D、\x1E、\x1F
\xD800 - \xDFFFxD800、xD801、xD802、xD803、xD804、xD805、xD806、xD807、xD808、xD809、xD80A、…、xDFFE、\xDFFF
\xFFFD - \xFFFF\xFFFD、\xFFFE、\xFFFF

3.5、违反 XML 规则非法字符的替代字符

非法字符十六进制 EF BF BD 通常是因为在处理包含UTF-8编码的XML文件时遇到了无法识别的字节序列。十六进制 EF BF BD 是UTF-8编码中的“替代字符”(�),它通常表示数据在解码时遇到了问题。当载入XML 文件中有 UTF-8 编码中的“替代字符”,也是存在 XML 无法识别的字节。

四、测量项目 MMT 文件常见错误内容

4.1 测站信息区域中文字段容易出现非法字符

在这里插入图片描述
由上图可见,黑色标注块出现了非法字符。当出现这类情况,原有 UTF-8 编码的中文出现错误,同时引起 XML 《开始标签》没有相应匹配的《结束标签》,如上图 < State > 没有匹配的结束标签 < /State >、< County > 没有匹配的结束标签 < /County > 等,或者标签缺失标志。主要原因可能是外界异常操作导致 UTF-8 编码的中文出现异常,或WinRiver II 软件可能存在 UTF-8 中文编码处理不严谨的 BUG!

4.2 QA/QC ADCP 测试区域字段容易出现非法字符

在这里插入图片描述
由上图可见,黑色标注块是出现的非法字符,当出现这类情况,主要原因可能是外界电气接触不良 或 ADCP 串口输出了异常字符,而 WinRiver II 软件没有进行相应处理。导致出现 UTF-8 异常编码!

五、Visual Studio C# 处理和修复 WinRiver II 测量项目 MMT 文件错误

5.1 引入类(空间名称)

using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml;

5.2 处理和修复 MMT 文件错误的代码主体

		static readonly Encoding UTF8NoBOM = new UTF8Encoding(false);//UTF-8 LE 编码
		OpenFileDialog Openfiledialog = new OpenFileDialog();
		Openfiledialog.Filter = "ADCP项目文件(*.MMT)|*.MMT";
		Openfiledialog.Title = "打开 ADCP 项目 MMT 文件";
		Openfiledialog.FilterIndex = 0;
		if (Openfiledialog.ShowDialog() == DialogResult.OK)
		{
		    try
		    {
				string MmtPathFile = Openfiledialog.FileName;
				string MmtFileString = File.ReadAllText(MmtPathFile, Encoding.UTF8);\\将 MMT 项目文件载入到字符串
				foreach (char chr in MmtFileString)
				{
					int Val = Convert.ToInt32(chr);
					if ((Val >= 0 && Val <= 8) || (Val >= 11 && Val <= 12) || (Val >= 14 && Val <= 31) || (Val >= 55296 && Val <= 57343) || (Val >= 65533 && Val <= 65535))
					{
						MmtFileString = MmtFileString.Replace(chr, '!');\非法字符暂时用英文感叹号代替
					}
				}
				MmtFileString = MmtFileString.Replace("!?/", "</");//消除非法字符后,修复可能产生的 XML 标签规则异常导致的不匹配
				MmtFileString = MmtFileString.Replace("!?", "?");
                
				XmlDocument XMLDoc = new XmlDocument();
				XmlTextWriter XmlWriter = new XmlTextWriter(MmtPathFile, UTF8NoBOM);// MMT 文件采用了UTF-8 LE 无 BOM 编码
				XMLDoc.LoadXml(MmtFileString);
				XmlWriter.Formatting = Formatting.Indented; //XML缩进格式化,便于查看内容,手工修复非法字符引起的汉字缺失
				XMLDoc.WriteTo(XmlWriter);
				XmlWriter.Flush();
				XmlWriter.Close();
				MessageBox.Show("文件已经修复,请手工修复非法字符引起的汉字缺失或错误!", "消息" , MessageBoxButtons.OK);
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.StackTrace, "程序内部错误: " + ex.Message, MessageBoxButtons.OK);
			}
		}	

六、程序下载

本地下载:
https://download.csdn.net/download/zyyujq/89884242

内容概要:该文档详细介绍了RDI垂直式及水平式ADCP的各项配置命令及ASCII格式输出的具体结构。文中首先提供了详细的命令解析及其操作细节,接着详细阐述了各类命令(如坐标转换EX、向导BX、BP、BN等)的应用背景,以及ASCII格式输出的数据格式规范说明。同时也讲解了导航数据的格式、ASCII输出的数据格式和具体的文件生成步骤,还针对ASCII类输出提供了一个简要的操作流程,包括流量的基础知识与概念。适合人群主要是ADCP设备用户和技术维护团队,尤其有助于从事河流流速与流向研究的专业人员提升对设备配置的理解和掌握数据结构的能力。使用场景为设备首次使用或重新配置ADCP,进行科学实验或是长期监测时进行精细调整与数据管理。本文重点还介绍了WinRiver II软件如何根据数据生成流量报告、流量数据后处理流程,以及不同测量条件下的适应方法。 适用人群:适合从事河流与海域科学研究的工作技术人员、ADCP操作人员与科研单位,特别是负责河流生态学、水文学及水利工程的科学家及专业技术人员。 使用场景及目标:主要服务于ADCP初次配置和后续重新配置的需求、设备故障排查时参数查询、科学实验条件下设备操作和数据解析、长时间河流水体的持续监控任务。 阅读建议:此文档不仅详细展示了ADCP配置的各项参数设置及其背后的物理意义,而且深入解析ADCP数据的输出格式和处理流程,便于研究人员进行数据分析和科学结论的推理与提取。建议仔细阅读配置命令和数据输出章节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中游鱼

获取完整源代码,提高工作效率

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值