0

我有一个想要转换为数据表的 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>

这是 DataTable 中想要的输出

    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 来做到这一点。

提前感谢约翰

4

1 回答 1

0

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

Linq-to-xml 通常不会根据 xpath 检索元素。Elements()andDescendants()方法允许您在不知道具体路径的情况下查询 xml 数据。

meetingDate无论它的路径是什么,要检索它,您可以使用如下Descendants()方法:

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

meetingCode并且actionCoOrdinator可以以类似的方式找到。

要获取所有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 语句中的子元素。

于 2013-10-31T16:11:31.313 回答