XML解析使用LINQ获取属性以及内容

时间:2013-11-25 07:37:01

标签: c# xml linq

这是我的XML,

<content id = "C1">
<paragraph >
      <Info />
      <contentValue>Content1</contentValue>
</paragraph>

<paragraph>
      <Info />
      <contentValue>Content2</contentValue>
</paragraph>
<content>

<content id = "C2">
<paragraph >
      <Info />
      <contentValue>Content3</contentValue>
</paragraph>

<paragraph>
      <Info />
      <contentValue>Content4</contentValue>
</paragraph>

<paragraph>
      <Info />
      <contentValue>Content5</contentValue>
</paragraph>
<content>

我需要解析每个<content>代码并获取<contentvalue>代码的值并将其存储在List中。

我正在使用以下代码,但<contentvalue>代码的值会像' Content1Content2 '

一样被整合
var xdoc = XDocument.Load(path);
var Contents = xdoc.Descendants("content").Select(c => (string)c).ToArray();

3 个答案:

答案 0 :(得分:1)

如果您不希望<contentValue><content>标记分组,请尝试:

<强> V1

var Contents = xdoc.Descendants("contentValue").Select(c => (string)c).ToArray();

或 的 V2

var Contents = xdoc.Root.XPathSelectElements("content/paragraph/contentValue")
       .Select(x => x.Value).ToList();

注意,要使用 V2 解决方案,您需要添加对System.Xml.XPath命名空间的引用。


(下一节代表一个不同的解决方案,针对不同但相似的案例,仅供参考) 否则,如果您需要获取按<content>标记分组的值,则可以尝试:

var grouped = xdoc.Descendants("contentValue")
       .Select(x => new { PNode = x.Ancestors("content")
       .FirstOrDefault().Attribute("id").Value, CNode = x.Value })
       .GroupBy(x => x.PNode).ToDictionary(x => x.Key, y => y.ToList());

然后可以按如下方式迭代:

foreach (var group in grouped)
{
     Console.WriteLine("content id = " + group.Key);
     foreach (var singleCValue in group.Value)
     {
          Console.WriteLine(singleCValue.CNode);
     }
}

答案 1 :(得分:1)

我发现了一些事情:

  1. 您的XML格式不正确
  2. 您正在尝试选择内容节点并将其呈现为字符串,这是错误的
  3. XML:

    <root>
        <content id="C1">
            <paragraph>
                <Info/>
                <contentValue>Content1</contentValue>
            </paragraph>
            <paragraph>
                <Info/>
                <contentValue>Content2</contentValue>
            </paragraph>
        </content>
        <content id="C2">
            <paragraph>
                <Info/>
                <contentValue>Content3</contentValue>
            </paragraph>
            <paragraph>
                <Info/>
                <contentValue>Content4</contentValue>
            </paragraph>
            <paragraph>
                <Info/>
                <contentValue>Content5</contentValue>
            </paragraph>
        </content>
    </root>
    

    代码:

    var Contents = xdoc.Descendants("content").Descendants("paragraph").Select(i => i.Element("contentValue").Value).ToList();
    

    上面的代码正好选择contentValue下的paragraph节点。

答案 2 :(得分:0)

我猜你的标签形成不好。你可以做这样的事情。

 XDocument doc = XDocument.Load(path);

            IList<string> list=new List<string>();

            IEnumerable<XElement> contentElements = doc.Descendants("content");//this get all "content" tags
            IEnumerable<XElement> contentValueElements = contentElements.Descendants("contentValue");//this get all "contentValue" tags

            foreach (XElement i in contentValueElements)
            {

                    list.Add(i.Value);
            }