访问xml中的列表

时间:2014-03-21 11:45:33

标签: c# xml

XML数据结构:

<CPT xmlns="http://www.example.org/genericClientProfile" xmlns:ns2="http://www.bosch-si.com/finance/cts/cpt/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/genericClientProfile genericClientProfile.xsd">
<header>
    <serviceId>CPT-UK</serviceId>
    <versionId>1.0</versionId>
    <brandCode>RBS.ADA</brandCode>
    <creationTime>2013-09-24T16:56:52.985+02:00</creationTime>
</header>
<clientProfile bpKey="19933" id="1bb26568-1df3-4206-8cea-fb4614bf0a6a" createdBy="BARBOURT" lastModifiedBy="MANNC" documentStructureVersion="V3_2" lastModifiedAt="2013-09-23 15:40:49.873" createdAt="2013-09-23 10:07:33.608">
<section xmlns="" id="cd21fbb5-da1b-485d-8909-a8392fd5ad5c" name="globalClientFacts">
    <attribute name="familyAndDependentComment" type="string">Tomas is 18 in 2013</attribute>
<list name="familyAndDependents">
    <entry entryId="1">
        <attribute name="famDependAge" type="decimal">0</attribute>
        <attribute name="famDependBirthdate" type="date" />
        <attribute name="famDependFinDep" type="boolean">false</attribute>
        <attribute name="famDependFinDepUntil" type="string" />
        <attribute name="famDependName" type="string">Tomas</attribute>
        <attribute name="famDependNat" type="xmlCountry">GB</attribute>
        <attribute name="famDependRel" type="enumeration">SON</attribute>
        <attribute name="famDependRelTo" type="string" />
    </entry>
<entry entryId="2"></list>
<attribute name="subCommentWills" type="string" />
</section>

我有以下数据结构,我想要做的是从我设法做的每个“部分”创建SQL插入语句。但是,如果一个部分包含一个列表,我需要获取列表名称,然后只获取其中一个条目的属性。目前它似乎将属性加倍,因为有两个条目。

C#:

    public void findAllNodes(XDocument doc, XNamespace ns)
    {
        StringBuilder attribute = new StringBuilder();
        StringBuilder values = new StringBuilder();
        values.Append("(");
        var db = cptsqlentity();

        foreach (var f in doc.Descendants(ns + "clientProfile").First().Elements())
        {
            if (f.Attribute("name") != null)
            {
                values.Append(")");
                attribute.Append(")");
                attribute.Append(values);
                values.Clear();
                attribute.Append(Environment.NewLine);
                attribute.Append("INSERT INTO ");
                values.Append(" VALUES (");

                    OracleCommand oracleq = new OracleCommand("SELECT TABLE_SHORT FROM LOOKUP WHERE TABLE_LONG = " + "'" + f.Attribute("name").Value + "'" + " AND ROWNUM <=1", db);
                    OracleDataReader dr = oracleq.ExecuteReader();
                    dr.Read();
                    attribute.Append(dr.GetString(0));
                    attribute.Append(" (");
            }

            foreach (var p in f.Descendants())
            {
                if (p.Attribute("name") != null) {
                    attribute.Append(p.Attribute("name").Value + ",");
                    values.Append("'" + p.Value + "'" + ",");
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

我不是100%确定您的XML文件的架构,但不会做以下事情吗?

使用以下内容替换上一个foreach语句:

foreach (var p in f.Elements("attribute")
                   .Union(f.Elements("list")
                           .SelectMany(l => l.Elements()
                                             .First()
                                             .Elements("attribute"))))
{
   //...
}

这会为attribute元素的所有section个孩子以及所有attribute个元素的第一个孩子的所有list个孩子提供这些孩子(这些孩子属于您的{ {1}})。

这有意义吗?