当XML可以引用许多对象中的一个时,如何处理C#中的XML解析?

当XML可以引用许多对象中的一个时,如何处理C#中的XML解析?,c#,xml,C#,Xml,我接收到一个包含XML响应的状态对象 此响应可以是“成功”消息、“错误”消息或null(尚未处理,因此没有消息) 我想不出一种优雅的方法来解析这个XML 我能想到的唯一两个选项是在每个错误消息上对XML字符串进行TryParse,或者执行string.Contains(“成功”)或string.Contains(“错误”) 在这两种方法中,胰蛋白酶似乎是最好的。。。但看起来还是很难看 我想知道是否有更好的处理方法 接收对象可以如下所示: public class ReturnedObject{

我接收到一个包含XML响应的状态对象

此响应可以是“成功”消息、“错误”消息或null(尚未处理,因此没有消息)

我想不出一种优雅的方法来解析这个XML

我能想到的唯一两个选项是在每个错误消息上对XML字符串进行TryParse,或者执行string.Contains(“成功”)或string.Contains(“错误”)

在这两种方法中,胰蛋白酶似乎是最好的。。。但看起来还是很难看

我想知道是否有更好的处理方法

接收对象可以如下所示:

public class ReturnedObject{
    public string MessageId
    public string MessageDescription
    public string XML
}
XML可以为null,也可以是以下示例之一:

<Success>
    <paymentReference>123</paymentReference>
    <targetBankAccount>01-0002-3948</targetBankAccount>
</Success>

我通常创建一个类结构,可以接受所有可能的XML输入。如果这是不可能的-作出最普遍的削减和预先测试您的输入序列化它。这样做应该是很少见的,而且当其中一个输入不是格式良好的XML时,我通常不得不这样做


如果根元素不同,您可以将整个输入包装在

例如:

ParseMessage(string xml)
{
   XDocument doc = XDocument.Parse(xml);
   String rootName = doc.Root.Name;

   if (rootName == "SuccessMessageName")
   {  
       //Depending if you deserialize from an XDocument...
       ProcessSuccessMessage(doc);
       // or String.
       ProcessSuccessMessage(xml);
   }
   else if (rootName == "ErrorMessageName")
       //etc.
}

或者,如果您不需要将整个消息作为
XDocument

请提供您试图解析的Xml示例,则可以使用其中一个来获取根元素名称,这可能更为理想。那么解析的预期结果是什么呢?如果您能提供一个XML示例,这将使帮助变得非常容易。还有,你的代码是什么样子的?XML总是采用一种格式:XML。我已经知道如何解析XML——我在寻找一种算法,而不是一个具体的例子。+1 lol谈论渐进式编辑。这几乎就像在看实时编码一样D@eandersson是的,点击太快了,那只是一个快速修复的问题:)不是一个好的解决方案,当其中一个输入是一个完整的数据集时,您仍然需要反序列化。如果xml为null,这将抛出一个错误,Root也有可能为null。@SamuelDavis,正确,但为了简洁起见,错误检查经常被省略。
        if (documentStatusResponse.Xml == null)
        {
            return disassociatedDocumentStatusResponse;
        }

        var root = XDocument.Parse(documentStatusResponse.Xml).Root;

        if (root != null)
        {
            if (root.Name == "Error")
            {
                disassociatedDocumentStatusResponse.Errors = _xmlExtractor.RetrieveStatusErrors(documentStatusResponse.Xml);
            }
            else if (root.Name == "Success")
            {
                disassociatedDocumentStatusResponse.Reconciliation =
                    _xmlExtractor.RetrieveStatusReconciliation(documentStatusResponse.Xml);
            }
        }
ParseMessage(string xml)
{
   XDocument doc = XDocument.Parse(xml);
   String rootName = doc.Root.Name;

   if (rootName == "SuccessMessageName")
   {  
       //Depending if you deserialize from an XDocument...
       ProcessSuccessMessage(doc);
       // or String.
       ProcessSuccessMessage(xml);
   }
   else if (rootName == "ErrorMessageName")
       //etc.
}