Объединение с LINQ к XML

Один из лучших вариантов для достижения вашей цели - использование правил брандмауэра, поскольку вы не можете ограничивать IP-адреса через глобальный LB или сам GCP L7 LB. Однако, если вы используете Ingress в своем кластере Kubernetes , вы можете ограничить доступ к вашему приложению на основе выделенных IP-адресов.

Одним из возможных вариантов использования может быть то, что у вас есть настройка разработки и вы не хотите, чтобы все модные новые функции были доступны всем, особенно конкурентам. В таких случаях могут использоваться белые списки IP для ограничения доступа.

Это можно сделать, указав допустимые диапазоны IP-адресов клиентов через аннотацию ingress.kubernetes.io/whitelist-source-range.

Значение представляет собой разделенный запятыми список блока CIDR.

Например:

10.0.0.0/24, 1.1.1.1/32.

Пожалуйста, получите больше информации здесь .

5
задан Jon Seigel 3 May 2010 в 18:44
поделиться

4 ответа

Ваш первый импульс был почти корректен.:) Согласно David B, если Вы не говорите LINQ точно, как Вы определяете равенство и затем даете ему набор XElements, оно сравнит их ссылкой. К счастью, можно сказать этому использовать различные критерии путем определения IEqualityComparer "XElement" (в основном, объект, который имеет, Равняется методу, который возвращает истинную эквивалентность, два XElements равны согласно определению и лжи иначе и методу GetHashCode, который берет XElement и возвращает хэш-код на основе критериев равенства).

Например:

var elements = xDocument.Descendants(w + "sdt")
               .Union(otherDocument.Descendants(w + "sdt", new XElementComparer())
               .RestOfYourCode

...

Где-то в другом месте в Вашем проекте

public class XElementComparer : IEqualityComparer‹XElement› {
   public bool Equals(XElement x, XElement y) {
     return ‹X and Y are equal according to your standards›;
}


 public int GetHashCode(XElement obj) {
     return ‹hash code based on whatever parameters you used to determine        
            Equals. For example, if you determine equality based on the ID 
            attribute, return the hash code of the ID attribute.›;

 }

 }

Примечание: У меня нет платформы дома, таким образом, точный код не тестируется, и код IEqualityComparer отсюда (прокрутите вниз к второму сообщению).

4
ответ дан 15 December 2019 в 01:12
поделиться

Действительно трудно диагностировать Ваше "левое соединение" наблюдение, не видя то, что это - Вы, используют, чтобы прийти к тому заключению. Вот мой выстрел в темноте.

XDocument doc1 = XDocument.Parse(@"<XML><A/><C/></XML>");
XDocument doc2 = XDocument.Parse(@"<XML><B/><C/></XML>");
//
var query1 = doc1.Descendants().Union(doc2.Descendants());
Console.WriteLine(query1.Count());
foreach (XElement e in query1) Console.WriteLine("--{0}",e.Name);

6
--XML
--A
--C
--XML
--B
--C
//
var query2 = doc1.Descendants().Concat(doc2.Descendants())
  .GroupBy(x => x.Name)
  .Select(g => g.First());
Console.WriteLine(query2.Count());
foreach (XElement e in query2) Console.WriteLine("--{0}", e.Name);

4
--XML
--A
--C
--B

В linq к объектам (который является тем, что linq к xml действительно), Объединение против использования ссылочных типов ссылочное равенство для тестирования на дубликаты. XElement является ссылочным типом.

0
ответ дан 15 December 2019 в 01:12
поделиться

Я смог заставить следующее работать, но это довольно ужасно:

var elements = xDocument.Descendants(w + "sdt")
                   .Concat(otherDocument.Descendants(w + "sdt")
                               .Where(e => !xDocument.Descendants(w + "sdt")
                                               .Any(x => x.Element(w + "sdtPr")
                                                             .Element(w + "tag")
                                                             .Attribute(w + "val").Value ==
                                                         e.Element(w + "sdtPr")
                                                             .Element(w + "tag")
                                                             .Attribute(w + "val").Value)))
                   .Select(sdt =>
                       new XElement(
                           sdt.Element(w + "sdtPr")
                               .Element(w + "tag")
                               .Attribute(w + "val").Value,
                           GetTextFromContentControl(sdt).Trim())
                   )
               );

Конечно, должен быть лучший путь.

0
ответ дан 15 December 2019 в 01:12
поделиться

Что относительно чего-то вроде этого?

var xDoc = from f in xDocument.Descendants(w + "sdt")
    select new {xNode = f, MatchOn = f.Element(w + "sdtPr").Element(w + "tag").Attribute(w + "val").Value };

var oDoc = from o in otherDocument.Descendants(w + "sdt")
    select new {MatchOn = o.Element(w + "sdtPr").Element(w + "tag").Attribute(w + "val").Value };

var elements = from x in xDoc.Where(f => !oDoc.Any(o => o.MatchOn == f.MatchOn))
    select new XElement(x.MatchOn, GetTextFromContentControl(x.xNode).Trim());
0
ответ дан 15 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: