当XML可以引用许多对象中的一个时,如何处理C#中的XML解析?
我接收到一个包含XML响应的状态对象 此响应可以是“成功”消息、“错误”消息或null(尚未处理,因此没有消息) 我想不出一种优雅的方法来解析这个XML 我能想到的唯一两个选项是在每个错误消息上对XML字符串进行TryParse,或者执行string.Contains(“成功”)或string.Contains(“错误”) 在这两种方法中,胰蛋白酶似乎是最好的。。。但看起来还是很难看 我想知道是否有更好的处理方法 接收对象可以如下所示:当XML可以引用许多对象中的一个时,如何处理C#中的XML解析?,c#,xml,C#,Xml,我接收到一个包含XML响应的状态对象 此响应可以是“成功”消息、“错误”消息或null(尚未处理,因此没有消息) 我想不出一种优雅的方法来解析这个XML 我能想到的唯一两个选项是在每个错误消息上对XML字符串进行TryParse,或者执行string.Contains(“成功”)或string.Contains(“错误”) 在这两种方法中,胰蛋白酶似乎是最好的。。。但看起来还是很难看 我想知道是否有更好的处理方法 接收对象可以如下所示: public class ReturnedObject{
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时,我通常不得不这样做
如果根元素不同,您可以将整个输入包装在
现在您有了一个已知的根元素来反序列化,为什么不使用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
请提供您试图解析的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.
}