【问题标题】:C# Load Datatable from LinQ XDocument using Using XPath where Xpath not known at compile timeC# 使用使用 XPath 从 LinQ XDocument 加载数据表,其中 Xpath 在编译时未知
【发布时间】:2013-11-06 17:30:48
【问题描述】:

我有一个想要转换为数据表的 LinQ XDocument(来自 SOAP 响应)。这是我正在处理的 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>

这是数据表中想要的输出

MeetingCode MeetingDate ActionCoOrdinator ActionType ActionBy ------------ ------------- -------------- --- ---------- -------- 8 2013-07-08T00:00:00+10:00 行动人 Type1 约翰 8 2013-07-08T00:00:00+10:00 动作男 Type2 Mary 8 2013-07-08T00:00:00+10:00 行动人 Type3 Phil

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

XDocument myXDoc = XDocument.Parse(soapStringResult);

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

ns2:getDetailsResponse/return/meeting/actionList/action

然后我有一个数据库表,其中包含我想要的与此 Xpath 相关的所有数据项。表格是这样的

XpathDataItem --------------------- ../../@meetingCode ../../meetingDate ../actionCoOrdinator 动作类型 行动依据

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

提前致谢 约翰

【问题讨论】:

    标签: c# xpath datatable namespaces linq-to-xml


    【解决方案1】:

    哪一部分不知道?要检索的起点还是单个元素?从你的问题中不清楚。如果您根本不知道起点,那么 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 语句中的子元素。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 2011-09-06
      相关资源
      最近更新 更多