-5

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

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

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

我能想到的唯一两个选项是尝试解析每个错误消息上的 XML 字符串,或者执行 String.Contains("Success") 或 String.Contains("Error")。

在这两种方法中,TryParse 似乎是最好的……但看起来仍然很丑。

我想知道是否有更好的方法来处理这个问题。

接收对象可能如下所示:

public class ReturnedObject{
    public string MessageId
    public string MessageDescription
    public string XML
}

XML 可以为 null 或以下示例之一:

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

或者

<Error>
    <errorMessage>Your bank account was invalid</errorMessage>
    <errorBelongsToField>BankNumber</errorBelongsToField>
</Error>

我当前的解析器看起来像:

        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);
            }
        }
4

2 回答 2

2

为什么不使用 XML 库(在我的示例中为 Linq-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.

于 2013-04-15T22:12:08.210 回答
0

我通常创建一个可以接受所有可能的 XML 输入的类结构。如果这是不可能的 - 进行最一般的剪辑并预先测试您的输入以对其进行序列化。很少需要这样做,而且当其中一个输入不是格式良好的 XML 时,我大多不得不这样做。

如果根元素不同,您可以将整个输入包装在里面<MyXML> .... </MyXML>,现在您有一个已知的根元素可以反序列化

于 2013-04-15T22:11:38.683 回答