2

我正在尝试找到一种将 xml 数据解析为 SQL 表的有效方法。

这是我将获得的 XML 的一个小例子,实际上在属性标签内会有大约 20-25 个标签和数百个条目。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry m:etag="W/&quot;28&quot;">
<id>114</id>
<title type="text">Title 1</title>
<updated>2012-07-09T15:02:08+01:00</updated>
<author>
  <name />
</author>
<m:properties>
  <d:ContentTypeID>456</d:ContentTypeID>
  <d:ApproverComments>Correction to Title</d:ApproverComments>
  <d:Name>bar.pdf</d:Name>
  <d:Title>Title</d:Title>
  <d:DocumentOwnerId m:type="Edm.Int32">20</d:DocumentOwnerId>
  <d:DocumentControllerId m:type="Edm.Int32" m:null="true"></d:DocumentControllerId>
</m:properties>
</entry>
<entry m:etag="W/&quot;28&quot;">
<id>115</id>
<title type="text">Title 2</title>
<updated>2012-07-09T15:05:35+01:00</updated>
<author>
  <name />
</author>
<m:properties>
  <d:ContentTypeID>456</d:ContentTypeID>
  <d:ApproverComments>Correction of Title2</d:ApproverComments>
  <d:Name>foo.pdf</d:Name>
  <d:Title>Title 2</d:Title>
  <d:DocumentOwnerId m:type="Edm.Int32">20</d:DocumentOwnerId>      
</m:properties>
</entry>

我需要查看每个“条目”并提取 m: properties 标记内的所有标记名称,并将它们设置为 SQL 表的列。

我正在寻找一种更有效的方法来执行此操作,而不是必须遍历所有条目的属性标签,然后将标签名称列表放在一起,然后我需要交叉引用以确保获得所有标签名称。

我一直在尝试寻找类似的功能;

String TagNames = XMLDoc.getChildNode('properties').getChildNodeNames()

TagNames 将等于“ContentTypeID、ApproverComments、Name、Title、DocumentOwnerID、DocumentControllerID”

任何帮助将不胜感激。

4

1 回答 1

0

假设您已经拥有一个XDocument,我们将其命名为doc,一种方法可能是:

doc.GetElements("entry")
   .Select(e => e.GetElement("m:properties")
                 .GetElements()
                 .Select(ce => ce.Name.LocalName)
                 .ToList())
   .ToList();

这应该List<List<string>>为每个条目提供一个。

您甚至可以使用idof限定内部列表entry

doc.GetElements("entry")
   .Select(e =>
   {
       var id = e.GetElement("id").Value;

       e.GetElement("m:properties")
        .GetElements()
        .Select(ce => string.Format("{0}|{1}", id, ce.Name.LocalName))
        .ToList()
    })
   .ToList();
于 2013-10-31T12:11:21.833 回答