Xml到字节数组,反之亦然

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
你好,

我正在编写一个基于xml的数据管理程序。网络上有一个服务器和一个客户端一起工作。服务器保存所有xml数据,客户端调用服务器,"ask's"服务器要通过网络发送数据。我想知道如何将xml文件转换为字节数组并通过网络发送。服务器和客户端正在相互通信,因此启动服务器和监听已完成。客户端连接也是如此。我需要帮助的部分是转换。我已经尝试执行此操作,这是我编写的代码。该代码将数据转换为字节区域(我认为),但是我不确定是否正确执行了此操作。

string xmlData = File.ReadAllText(rootPath + "\\ActivityData\\ActivityData.xml");

                    byte[] dataBuffer = Encoding.UTF8.GetBytes(xmlData);
               


                    server.SendTo(R.Name, "V^Activity-" + Convert.ToBase64String(dataBuffer));


现在我需要将其转换回xml并保存或将xml加载到datagridview中

任何帮助,将不胜感激

InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
请记住,所有文件都是以字节开头。让我们考虑一下您的代码在做什么。它将文件的原始字节转换为字符串,然后将其转换为字节,然后将这些字节转换为字符串,然后将其转换为字节。您似乎认为效率低下吗?您应该做的就是简单地调用File.ReadAllBytes并发送返回的Byte数组。我不知道您的“服务器”对象是什么,但是唯一可以发送的是字节,因此必须将base-64字符串转换回Bytes才能发送,因此创建base-64毫无意义首先来自Byte数组的字符串。
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
谢谢您的回复,

因此,我听取了您的建议,并删除了不需要的代码,我们不想将n转换回....所以我想我的下一个问题是如何在客户端将其转换回xml?

现在我在服务器端
byte[] xmlData = File.ReadAllBytes(rootPath + "\\ActivityData\\ActivityData.xml");


这是在客户端
  
                   byte[] recData = Encoding.UTF8.GetBytes(msg);
                   string xmlData = Convert.ToBase64String(recData);
                   MessageBox.Show(xmlData);


其中msg是来自服务器的传入数据

我感谢您的帮助

InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
假设您要在另一端将数据存储在文件中,则File.WriteAllBytes与File.ReadAllBytes相反。或者,您可以将可以从Stream读取的任何内容放在另一端的NetworkStream之上,例如XmlReader,并直接读取XML。
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
好的,我编写了两种方法...一种将xml文件转换为字节数组,另一种将字节数组转换回xml ...我知道它们都可以工作,在通过网络发送它们之前,我已经对其进行了测试。问题是一旦数据到达客户端....我得到一个错误...根元素具有无效的字符....我认为问题是一旦xml​​转换为send方法转换的字节数组它转换为字符串...所以我尝试将字符串转换为xml,但是没有运气..以下是我编写的两种方法,将xml格式转换为字节,反之亦然。

  private byte[] ConvertXmlToByteArray(XmlDocument xml, Encoding encoding)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                XmlWriterSettings settings = new XmlWriterSettings();


                settings.Encoding = encoding;
                settings.OmitXmlDeclaration = true;


                using (XmlWriter writer = XmlWriter.Create(stream, settings))
                {
                    xml.Save(writer);
                }


                return stream.ToArray();
            }
        }




        private XElement ConvertByteArrayToXml(byte[] data)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
           
            using (MemoryStream stream = new MemoryStream(data))
            using (XmlReader reader = XmlReader.Create(stream, settings))
            {
                return XElement.Load(reader);
            }
        }


我想我的问题是,如何将接收到的数据转换为xml文档。

谢谢你
-InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您是否认为Send方法将其转换为String还是知道吗?如果可以,为什么呢?实际上,您唯一可以通过电线发送的东西是字节,因此,如果您的Send方法将字节转换为字符串,则无论如何必须再次将其转换回字符串。最好是效率低下,最坏的是破坏了整个机制。

我会建议一件事。我不确定这是否是一个问题,但是,以防万一,在加载XML之前将MemoryStream的读取位置重置为开始,可以使用Position属性或Seek方法进行此操作。
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
是的!是的!是的!

我忘记了阅读位置....我会尝试的.....

顺便说一句...谢谢您的所有帮助...如果不是您的帮助我也不会走这么远。我会告诉您是否可行。

谢谢你
-InkedGFX
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
好吧,我尝试过重置流。Position= 0;
但仍然出现错误.....根级别的数据无效,第1行位置1

男人,我们是如此接近.....

-InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
因此,您是说可以使用这两种方法并以与开始时相同的XML结束,但是在两次之间通过有线方式发送数据会导致问题?在这种情况下,我想您需要查看发送的数据和接收的数据,然后将两者进行比较以了解两者之间的区别。大概数据在某个地方被截断了,但是在确定位置之前,您首先必须知道正在发生什么。我建议在每种情况下都将数据转换为十六进制,以便可以看到每个字节。以下是将字节数组转换为十六进制字符串的方法,反之亦然:
/// <summary>
/// Converts an array of <see cref="byte">bytes</see> into a <see cref="string"/> containing a space-delimited list upper-case hexadecimal digit pairs.
/// </summary>
/// <param name="bytes">
/// The <b>bytes</b> to convert.
/// </param>
/// <returns>
/// A <b>string</b> containing hexadecimal digits.
/// </returns>
private string BytesToHex(byte[] bytes)
{
    return string.Join(" ", bytes.Select(b => b.ToString("X2")));
}

/// <summary>
/// Converts a <see cref="string"/> containing a space-delimited list upper-case hexadecimal digit pairs into an array of <see cref="byte">bytes</see>.
/// </summary>
/// <param name="hex">
/// The <b>string</b> to convert.
/// </param>
/// <returns>
/// An array of <b>bytes</b>.
/// </returns>
private byte[] HexToBytes(string hex)
{
    return hex.Split(' ').Select(s => Convert.ToByte(s, 16)).ToArray();
}
也可能需要支付发送发送和接收代码的费用,因为如果此XML转换在没有该功能的情况下工作,那肯定是问题所在。
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
好的...不确定我该怎么做...我拥有的数据是xml文件.....我要在哪一侧使用...可能是一个愚蠢的问题...但我很困惑

-InkedGFX
 
最佳 底部