C# 解析xml字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 解析xml字符串相关的知识,希望对你有一定的参考价值。

字符串格式:

<rss>
<cmd>getequlist</cmd>
<rec>0</rec>
<num>23</num>
<record id="0">
<equcode>9</equcode>
<net>1</net>
<shield>0</shield>
<work>0</work>
</record>
<record id="1">
<equcode>8</equcode>
<net>1</net>
<shield>0</shield>
<work>0</work>
</record>
<record id="2">
<equcode>7</equcode>
<net>0</net>
<shield>0</shield>
<work>0</work>
</record>
</rss>
其中定义类ListInfo属性有cmd、rec、num、List<Object> recordList 提供get和set方法
Record类定义id、equcode、net、shield、work
怎么对字符串进行解析 然后生成一个ListInfo对象呢
求代码。。

参考技术A XmlDocument xmlDoc = new XmlDocument();
string fileName =( AppGlobal.AppControl.GetPhysicalApplicationPath() + "Xml\\GV_Xml\\" + xmlname + ".xml").Replace("WebSite","WebService");
xmlDoc.Load(fileName);
XmlNodeList xWitsTablesList = xmlDoc.SelectNodes("/config");
foreach (XmlNode xOracleNode in xWitsTablesList)

foreach (XmlNode node2 in xOracleNode.ChildNodes)

if (IsXMLUtility.XmlHelper.GetAttributeInnerText(node2.Attributes["Desc"]) == "在用")

DataRow dr = result.NewRow();
dr["Name"] = IsXMLUtility.XmlHelper.GetAttributeInnerText(node2.Attributes["Name"]);
dr["FieldName"] = IsXMLUtility.XmlHelper.GetAttributeInnerText(node2.Attributes["FieldName"]);
dr["Width"] = IsXMLUtility.XmlHelper.GetAttributeInnerText(node2.Attributes["Width"]);
dr["if_display"] = IsXMLUtility.XmlHelper.GetAttributeInnerText(node2.Attributes["if_display"]);
result.Rows.Add(dr);


参考技术B 当然是用xml命名空间里面的函数了。
遍历每个节点,以及字节点,再用switch语句。本回答被提问者采纳

在 C# 中安全地解析 XML

【中文标题】在 C# 中安全地解析 XML【英文标题】:Securely parse XML in C# 【发布时间】:2017-02-16 22:08:22 【问题描述】:

我有一个 C# 应用程序,它从表示 UTF-8 编码的 XML 消息的外部服务接收字节数组。此 XML 数据包含敏感数据,我不希望将其存储在字符串对象中,因为字符串是不可变的,并且在完成处理后我无法擦除这些值。我目前正在使用 System.XML.XmlReader 将值解析为字符串(参见下面的代码)。在不让我的代码(或我正在调用的代码)将敏感数据存储为字符串的情况下,我如何才能做到这一点?

        byte[] messsage = Encoding.UTF8.GetBytes(request);
        // Send message to the server. 
        sslStream.Write(messsage);
        sslStream.Flush();

        // read the response
        byte[] buffer = new byte[2048];
        StringBuilder messageData = new StringBuilder();
        int bytes = -1;
        do
        
            bytes = sslStream.Read(buffer, 0, buffer.Length);

            // Use Decoder class to convert from bytes to UTF8
            // in case a character spans two buffers.
            Decoder decoder = Encoding.UTF8.GetDecoder();
            char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
            decoder.GetChars(buffer, 0, bytes, chars, 0);
            messageData.Append(chars);
            // Check for ending tag.
            if (messageData.ToString().IndexOf(expectedEndTag) != -1)
            
                break;
            
         while (bytes > 0);

        string response = messageData.ToString();

        using (XmlReader reader = XmlReader.Create(new StringReader(response)))
        
            reader.ReadToFollowing("Success");
            string successVal = reader.ReadElementContentAsString();
            success = bool.Parse(successVal);
        

【问题讨论】:

加密值。无论如何,当它从外部服务传输时,它应该被加密,因为一些不良行为者可能会拦截数据。 “此 XML 数据包含敏感数据,我不希望将其存储在字符串对象中,因为字符串是不可变的,当我处理完它们后我无法擦除这些值”。请参阅安全字符串。它是保密的,而不是保存在内存中。 msdn.microsoft.com/en-us/library/… 如果您只是担心内存中的字符串,您可以考虑使用 SecureString,msdn.microsoft.com/en-us/library/… @rory.ap 数据在传输过程中被加密,但这是我需要将数据未加密但我希望将其存储在 byte[] 而不是字符串中的地方。 XML 文件中的敏感数据是十六进制编码的。 在撰写本文时,PCI-DSS 对内存中的机密保护没有要求。正如您所说,从序列化表单中解析它而不解密它无论如何都是不可能的。您可能想要做的是花一些时间确保内存中的存储真的只是易失性的,并且不会意外地将潜在的秘密数据写入不期望的永久存储位置。这可能意味着确保禁用或适当保护任何故障转储,并且您没有系统或 VM 虚拟内存将易失性存储分页到磁盘。 【参考方案1】:

根据答案,并考虑到字符串是不可变的事实,您应该编写自己的使用 char[] 的 XML 解析器。完成解析后,擦除 char 数组内容。要在程序中使用敏感数据,请使用SecureString 作为cmets 中建议的@Ga ber-ber 和@Mumbo。

这很难重复,但这样你可以确保在解析后立即擦除内存。

【讨论】:

以上是关于C# 解析xml字符串的主要内容,如果未能解决你的问题,请参考以下文章

c#解析XML字符串

如何C#解析xml格式字符串

C#合成解析XML与JSON

在 C# 中将 XML 字符串解析为类? [复制]

如何在 C# 中读取和解析 XML 文件?

C# XML 解析问题