C# 使用 Using XPath 从 LinQ XDocument 加载数据表,其中 Xpath 在编译时未知

本文关键字:Xpath 其中 编译 未知 数据表 加载 Using 使用 XPath XDocument LinQ | 更新日期: 2023-09-27 18:37:07

我有一个LinQ XDocument(来自SOAP响应),我想把它变成一个Datatable。 这是我正在处理的 XML。它使用命名空间使问题进一步复杂化。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns2:getDetailsResponse xmlns:ns2="http://service.xyz.com/">
            <return>
                <meeting meetingCode="8">
                    <meetingDate>2013-07-08T00:00:00+10:00</meetingDate>
                    <actionList>
                        <actionCoOrdinator>The action man</actionCoOrdinator>
                        <action>
                            <actionType>Type1</actionType>
                            <actionBy>John</actionBy>
                        </action>
                        <action>
                            <actionType>Type2</actionType>
                            <actionBy>Mary</actionBy>
                        </action>
                        <action>
                            <actionType>Type3</actionType>
                            <actionBy>Phil</actionBy>
                        </action>
                    </actionList>
                </meeting>
            </return>
        </ns2:getDetailsResponse>
    </soap:Body>
</soap:Envelope>

这是数据表中想要的输出

    会议代码 会议日期 操作协调器 操作类型 操作者    ----------- ------------------------- ----------------- ---------- --------    8 2013-07-08T00:00:00+10:00 动作人 类型1 约翰    8 2013-07-08T00:00:00+10:00 动作男人 类型2 玛丽    8 2013-07-08T00:00:00+10:00 动作人 类型3 菲尔

如您所见,我希望"actionList"中的每个"操作"元素都有一行,但对于每一行,我还需要来自父/祖父元素的一些信息。 在这个阶段,我所拥有的只是一个使用以下代码的 XDocument;

XDocument myXDoc = XDocument.Parse(soapStringResult);

我在这个网站上看到了各种关于从XDocument中提取数据的帖子,但我的问题是我想要的数据项事先不知道。 我的起点是代表"行"的 xPath。 Xpath是

ns2:getDetailsResponse/return/meeting/actionList/action

然后我有一个数据库表,其中包含我想要的相对于此 Xpath 的所有数据项。 表格如下所示

    XpathDataItem    ---------------------    ../../@meetingCode    ../../会议日期    ../actionCoordinator    动作类型    动作通过

当我知道要查找的数据项的 Xpath 时,我可以将数据加载到 DataTable 中,但我只是不知道如何使用一组未知的 XPath 来做到这一点。

提前致谢John

C# 使用 Using XPath 从 LinQ XDocument 加载数据表,其中 Xpath 在编译时未知

哪个部分未知?起点还是要检索的各个元素?从你的问题中不清楚。如果您根本不知道起点,那么 Linq-to-xml 将非常适合此。

Linq-to-xml 通常不会基于 xpath 检索元素。Elements()Descendants() 方法允许您在不知道特定路径的情况下查询 xml 数据。

若要检索meetingDate而不考虑其路径,可以使用如下所示的Descendants()方法:

var meetingDateElement = myXDoc.Descendants("meetingDate").SingleOrDefault;
if (meetingDateElement != null) {
    var meetingDate = meetingDateElement.Value;
}

meetingCodeactionCoOrdinator都可以以类似的方式找到。

要获取所有action元素,您只需使用 myXDoc.Descendants("action") .像这样的事情会为你获取每个操作的值:

var actions = from a in myXDoc.Descendants("action")
              select new {
                             actionType = a.Element("actionType").Value,
                             actionBy = a.Element("actionBy").Value
                          };

如果要解析的 xml 可能包含多个meeting元素,则可以使用"myXDoc.Descendants("meeting")来获取所有会议并在查询或 foreach 语句中检索子元素。