【问题标题】:Checking XML for expected structure检查 XML 的预期结构
【发布时间】:2012-02-24 02:40:13
【问题描述】:

我正在调用一个函数,该函数返回一个包含 XML 数据的字符串。这个函数如何工作并不重要,但是根据函数的成功,生成的 xml 可能会有所不同。

基本上,该函数将返回期望的 XML 或错误格式的 XML。以下是这两个结果的基本示例...

成功时:

<SpecificResult>
    <Something>data</Something>
</SpecificResult>

出错时:

<ErrorResult>
    <ErrorCode>1</ErrorCode>
    <ErrorMessage>An Error</ErrorMessage>
</ErrorResult>

我的系统设置方式是我可以使用简单的转换器函数将 xml 字符串转换为类,但这需要我知道类类型。成功后,我会知道它是 SpecificResult 并且我可以转换。但是我想先检查一下是否发生了错误。

理想的最终结果将允许类似的事情......

string xml = GetXML();
if(!IsError(xml))
{
   //convert to known type and process
}

那么问题是,实现IsError 函数的最佳方式是什么?

我已经想到了几个选项,但不确定我是否真的喜欢其中任何一个......

  1. 检查xml字符串是否包含"&lt;ErrorResult&gt;"
  2. 尝试将 xml 转换为 ErrorResult 类并检查是否失败
  3. 使用 XDocument 或类似的内置函数来解析树并搜索 ErrorResult 节点

【问题讨论】:

    标签: c# xml validation


    【解决方案1】:

    由于GetXml() 方法本质上是返回无类型数据,并且这里唯一安全的假设是它的结构为XML,因此断言其实际类型的最安全方法是将其解析为 XML:

    private bool IsError(string xml)
    {
        var document = XDocument.Parse(xml);
        return document.Element("ErrorResult") != null;
    }
    

    【讨论】:

    • 谢谢,这对我来说已经足够可靠了。只是为了确保文档中的 msdn 不清楚,失败的 Parse 尝试仍将返回 XDocument(尽管是空的)对吗? ...另外,等待接受的答案,将等着看其他人是否有任何意见;)
    • XDocument.Parse(string) 实际上是throw an XmlException if it encounters invalid XML。但是,在这种情况下,这听起来像是一个真正的 异常 条件,因此您可能不想在 IsError(string) 方法中处理它,而是允许异常在调用链中进一步向上传播。跨度>
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多