Linq to XML (Получить конкретные значения под одним узлом) - PullRequest
0 голосов
/ 21 июня 2011

у меня есть xml, подобный следующему.

  <testing>
  <node01 name="node01Name">
    <node02s>
      <node02 name="1">
        <CustomProperties>
          <CustomProperty Name="ASCII File Name" Value="index.txt" FilterID="0" />
          <CustomProperty Name="ASCII Folder" Value="\\abc\cdf\aaaa" FilterID="0" />
          <CustomProperty Name="Delimiter" Value="CommaQuote" FilterID="0" />
          <CustomProperty Name="Duplicate Handling" Value="Replace if Dup" FilterID="0" />
          <CustomProperty Name="EMAILATTDOC" Value="1" FilterID="0" />
          <CustomProperty Name="EMAILATTINDEX" Value="0" FilterID="0" />
          <CustomProperty Name="EMAILOUTBODY" FilterID="0" />
          <CustomProperty Name="EMAILOUTCC" FilterID="0" />
        </CustomProperties>
      </node02>
      <node02 name="2">
        <CustomProperties>
          <CustomProperty Name="ASCII File Name" Value="index.txt" FilterID="0" />
          <CustomProperty Name="ASCII Folder" Value="\\abc\cdf\aaaa" FilterID="0" />
          <CustomProperty Name="Delimiter" Value="CommaQuote" FilterID="0" />
          <CustomProperty Name="Duplicate Handling" Value="Replace if Dup" FilterID="0" />
          <CustomProperty Name="EMAILATTDOC" Value="1" FilterID="0" />
          <CustomProperty Name="EMAILATTINDEX" Value="0" FilterID="0" />
          <CustomProperty Name="EMAILOUTBODY" FilterID="0" />
          <CustomProperty Name="EMAILOUTCC" FilterID="0" />
        </CustomProperties>
      </node02>
    </node02s>    
  </node01>  
</testing>

Мне нужно получить каждый CustomProperty под каждым node02.это мой код.

XDocument configparentXML = XDocument.Load("admin.xml");
string node = "node02";

var batchClasses = from batchClasse in configparentXML.Descendants(node)
                   select new ReadingXmlWithLinq
                   {
                       BatchClassName = batchClasse.Attribute("Name") != null ? batchClasse.Attribute("Name").Value : "",
                   };

foreach (var lv0 in batchClasses)
{
    node = "CustomProperty";
    var CustomProperties = from CustomProperty in configparentXML.Descendants(node)                                       
                           select new ReadingXmlWithLinq
                           {
                               CustomPropertyName = documentClasse.Attribute("Name") != null ? documentClasse.Attribute("Name").Value : ""
                           };
}

Но при его возврате все значения CustomPropery возвращаются.Как я могу получить CustomerPropery для node02?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Я бы подошел к этому с XPath:

var xmlString = @"<testing>...</testing>";
var doc = XDocument.Parse(xmlString);
var nav = doc.CreateNavigator();
var path = "/testing/node01/node02s/node02/CustomProperties/CustomProperty";
var nodeIterator = nav.Select(path);
var nodes =
    nodeIterator
        .Cast<XPathNavigator>()
        .Select(n=>XElement.Parse(n.OuterXml));

EDIT

Чтобы получить все узлы, скажем, <node02 name="2">, вы можете изменить путь следующим образом:

var path=
   "/testing/node01/node02s/node02[@name=2]/CustomProperties/CustomProperty";

Вот страница примеров XPath , чтобы вы могли увидеть, что возможно.

1 голос
/ 21 июня 2011

Мне не понятно, как вы хотите получить данные, здесь просто недостаточно информации для работы.

Вместо этого, вот пример того, как вы можете выбрать все node02 элементы и получить их имена и имена их CustomProperty. Это выбирает ALL node02 и ALL их CustomProperty, как и ваш код. Вы на самом деле ничего не фильтруете и не указываете , какие узлы или свойства вам нужны. Это сбивает с толку то, что вы действительно хотите. Итак, вместо этого, вот пример, показывающий, как вы можете делать то, что вы хотите сделать:

XDocument doc = ...;
var batchClasses = doc.Descendants("node02")
    .Select(n => new
    {
        BatchClassName = (string)n.Attribute("name") ?? "",
        CustomPropertyNames = n.Descendants("CustomProperty")
            .Select(cp => (string)cp.Attribute("Name") ?? "")
            .ToList(),
        // Here's an example to select "EMAIL" custom property names
        EmailPropertyNames = n.Descendants("CustomProperty")
            .Select(cp => (string)cp.Attribute("Name") ?? "") // select the names...
            .Where(s => s.StartsWith("EMAIL"))                // that start with "EMAIL"
            .ToList(),                
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...