Используя xml linq, я помещаю результаты в словарь, разбирая все свойства в xml
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication97
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<Respcondition> responses = doc.Descendants("respcondition").Select(x => new Respcondition()
{
_continue = (string)x.Attribute("continue"),
varequal = (string)x.Descendants("varequal").FirstOrDefault(),
respident = (string)x.Descendants("varequal").FirstOrDefault().Attribute("respident"),
setvar = (string)x.Element("setvar"),
action = (string)x.Element("setvar").Attribute("action"),
linkrefid = (string)x.Element("displayfeedback").Attribute("linkrefid"),
feedbacktype = (string)x.Element("displayfeedback").Attribute("feedbacktype")
}).ToList();
Dictionary<string, List<Respcondition>> dict = responses.GroupBy(x => x.respident, y => y)
.ToDictionary(x => x.Key, y => y.ToList());
}
}
public class Respcondition
{
public string _continue { get; set; }
public string varequal { get; set; }
public string respident { get; set; }
public string setvar { get; set; }
public string action { get; set; }
public string linkrefid { get; set; }
public string feedbacktype { get; set; }
}
}
//<respcondition continue="Yes">
// <conditionvar>
// <varequal respident="gap_0">auswahl1</varequal>
// </conditionvar>
// <setvar action="Add">1</setvar>
// <displayfeedback linkrefid="0_Response_0" feedbacktype="Response"/>
// </respcondition>
Я думаю, что нашел решение своей проблемы. Вот то, что я сделал:
select CONCAT(INET_NTOA(ip_addr),'/',32-log2((4294967296-ip_mask))) net
from subnets
order by ip_addr
В основном я беру свою decmial маску и вычитаю ее из максимального десятичного значения. Я затем к log2 на том значении для получения значения логарифма. Затем просто вычтите это от 32 (максимальный доступный бит).
Надежда, которая помогает другим.
Спасибо
SQL-запросы не имеют процедурной конструкции цикличного выполнения (несмотря на процедурный язык), но можно сравнить один набор строк к другому набору строк, который отчасти похож на цикл.
У Вас только есть 32 возможных маски подсети. В случаях как это имеет смысл составлять маленькую таблицу, которая хранит эти 32 маски и связанное число CIDR.
CREATE TABLE cidr (
bits INT UNSIGNED PRIMARY KEY,
mask INT UNSIGNED NOT NULL
);
INSERT INTO cidr (bits) VALUES
( 1), ( 2), ( 3), ( 4), ( 5), ( 6), ( 7), ( 8), ( 9), (10),
(11), (12), (13), (14), (15), (16), (17), (18), (19), (20),
(21), (22), (23), (24), (25), (26), (27), (28), (29), (30),
(31), (32);
UPDATE cidr SET mask = ((POWER(2,32)-1)<<(32-bits)) & (POWER(2,32)-1);
SELECT CONCAT(s.ip_addr, '/', c.bits)
FROM cidr c JOIN subnets s ON (c.mask = inet_aton(s.ip_mask));