通过 ajax 将 XML 属性与 Elements 一起发送到 C# 控制器方法并解析以保存

Posted

技术标签:

【中文标题】通过 ajax 将 XML 属性与 Elements 一起发送到 C# 控制器方法并解析以保存【英文标题】:Send XML attributes along with Elements via ajax to C# controller method and parse to save 【发布时间】:2020-11-07 16:16:23 【问题描述】:

通常要在网页上编辑的 XML 元素作为输入名称发送过来 示例:

然后在 C# 控制器方法中:

List<string> keys = Request.Form.Keys.Cast<string>().Where(item => item[0] == '/' && item[1] == '/').ToList();
foreach (var key in keys)

   var item = xDoc.SelectSingleNode(key, manager);
   if (item != null)
      item.InnerText = Request.Form[key];
   else
       throw new InvalidOperationException("Could not decode parameter with key " + key + " and value " + Request.Form[key]);

通常,XML 元素在 Key Collection 的 Request.Form 部分中发送,因此 1 个关键示例是:

"//IVS-NONINST-REC/IVS-NONINST-REC-REST[1]/IVS-SEC-DIAG-CDS[1]/IVS-SEC-DIAG-T[1]"

但是,我需要发送一些属性来解析和保存这些属性。 我不知道如何“正确”发送它们,如果我发送属性就像

"//IVS-NONINST-REC/IVS-NONINST-REC-REST[1]/IVS-SEC-DIAG-CDS[1]/IVS-SEC-DIAG-T[1]/IVS-SEC-DIAG"

代码循环遇到 throw new InvalidOperationException。

    如何正确发送属性? 如何正确解析 C# 中的属性以保存它们?

该元素及其属性的 XML 如下所示

<IVS-SEC-DIAG-T IVS-SEC-DIAG="C56.9" IVS-SEC-POA="">test</IVS-SEC-DIAG-T>

更新,完整的xml(为简洁删除了一些)

 <IVS-NONINST-REC xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <IVS-NONINST-REC-KEY IVS-REC-TYP="2" IVS-TM-STAMP="210549" IVS-ADJ-KEY="5">    
    </IVS-NONINST-REC-KEY>
    <IVS-NONINST-REC-REST IVS-PAT-ID="333089302">
      <IVS-SEC-DIAG-CDS>
       <IVS-SEC-DIAG-T IVS-SEC-DIAG="C56.9" IVS-SEC-POA="">test</IVS-SEC-DIAG-T>
    </IVS-NONINST-REC-REST>
</IVS-NONINST-REC>

虽然我可以在 xDoc Innerhtml 中看到所有 xml 元素和属性,但 xDoc 认为没有属性 这是屏幕截图

【问题讨论】:

我已经读了几遍了,但我不确定我是否完全理解。让我们从这个开始:1)你到底是什么意思“发送”? 2)什么是“经理”? 3) 您是否验证过 xDoc 中存在与您的密钥匹配的项目? 发送 - 从带有 ajax 的 html。对于此属性“IVS-SEC_DIAG”,我只是将其附加到元素 /IVS_SEC_DIAG-T[1] 之后 Manager 是 XmlNamespaceManager manager = new XmlNamespaceManager(new NameTable()); ,我看到它确实添加了一些命名空间,例如 manager.AddNamespace("ns0", "..... 是的 - 这个 IVS-SEC-DIAG" 是我添加的一个键 - 但是以请求形式发送 XML 数据以进行解析我不确定是否应该将属性添加到末尾。 .. 你试过xDoc.SelectSingleNode(key)吗?命名空间不是必需的。 【参考方案1】:

您应该在 xpath 中的属性名称中添加 @

//.../IVS-SEC-DIAG-T[1]/@IVS-SEC-DIAG

【讨论】:

以上是关于通过 ajax 将 XML 属性与 Elements 一起发送到 C# 控制器方法并解析以保存的主要内容,如果未能解决你的问题,请参考以下文章

Ajax与jQueryjson

ajax

Ajax与JSON使用教程

使用'xmlbf'解析具有'nil'属性和空'element'标签的XML

Ajax与JSON的一些总结

如何使用PowerShell更改XML Element属性的值?