185 lines
5.9 KiB
Plaintext
185 lines
5.9 KiB
Plaintext
[10]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.1. Ñîçäàíèå XML-äîêóìåíòà
|
|
// LinqXml10: ïðàâèëüíîå ðåøåíèå (ñ.227)
|
|
begin
|
|
Task('LinqXml10');
|
|
var a := ReadAllLines(ReadString);
|
|
var d := new XDocument(
|
|
new XDeclaration(nil, 'windows-1251', nil),
|
|
new XElement('root',
|
|
a.Select(e -> e.StartsWith('data:') ?
|
|
new XProcessingInstruction('instr', e.Substring(5)) as XNode:
|
|
new XElement('line', e) as XNode)));
|
|
d.Save(ReadString);
|
|
end.
|
|
[20]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.2. Àíàëèç ñîäåðæèìîãî XML-äîêóìåíòà
|
|
// LinqXml20: ïðàâèëüíîå ðåøåíèå (ñ.235-236)
|
|
begin
|
|
Task('LinqXml20');
|
|
var d := XDocument.Load(ReadString);
|
|
foreach var e1 in d.Root.Elements do
|
|
begin
|
|
write(e1.Name.LocalName);
|
|
var max := e1.Descendants
|
|
.Select(e -> e.Attributes.Count())
|
|
.DefaultIfEmpty(-1).Max;
|
|
write(max);
|
|
var a := e1.Descendants
|
|
.Where(e -> e.Attributes.Count() = max)
|
|
.Select(e -> e.Name.LocalName)
|
|
.OrderBy(e -> e)
|
|
.DefaultIfEmpty('no child');
|
|
foreach var e in a do
|
|
write(e);
|
|
end
|
|
end.
|
|
[28]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.3. Ïðåîáðàçîâàíèå XML-äîêóìåíòà
|
|
// LinqXml28: ïðàâèëüíîå ðåøåíèå (ñ.238)
|
|
begin
|
|
Task('LinqXml28');
|
|
var name := ReadString;
|
|
var d := XDocument.Load(name);
|
|
d.Root.Elements().Elements().Elements()
|
|
.Nodes().OfType&<XText>().Remove();
|
|
d.Save(name);
|
|
end.
|
|
[32]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.3. Ïðåîáðàçîâàíèå XML-äîêóìåíòà
|
|
// LinqXml32: ïðàâèëüíîå ðåøåíèå (ñ.242)
|
|
begin
|
|
Task('LinqXml32');
|
|
var name := ReadString;
|
|
var s1 := ReadString;
|
|
var s2 := ReadString;
|
|
var d := XDocument.Load(name);
|
|
foreach var e in d.Root.Elements().Elements(s1) do
|
|
e.AddBeforeSelf(new XElement(s2,
|
|
e.LastAttribute, e.Elements().FirstOrDefault()));
|
|
d.Save(name);
|
|
end.
|
|
[37]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.3. Ïðåîáðàçîâàíèå XML-äîêóìåíòà
|
|
// LinqXml37: ðåøåíèå ñ èñïîëüçîâàíèåì âûðàæåíèÿ çàïðîñà (ñ.244)
|
|
begin
|
|
Task('LinqXml37');
|
|
var name := ReadString;
|
|
var d := XDocument.Load(name);
|
|
var a := d.Root.Elements().Elements()
|
|
.Where(e -> not e.IsEmpty);
|
|
foreach var e in a do
|
|
e.Value := e.Value;
|
|
d.Save(name);
|
|
end.
|
|
[50]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.4. Ïðåîáðàçîâàíèå òèïîâ ïðè îáðàáîòêå XML-äîêóìåíòà
|
|
// LinqXml50: ïðàâèëüíîå ðåøåíèå (ñ.254)
|
|
begin
|
|
Task('LinqXml50');
|
|
var name := ReadString;
|
|
var d := XDocument.Load(name);
|
|
d.Root.AddFirst(new XElement('total-time',
|
|
d.Root.Elements()
|
|
.Select(e ->
|
|
begin
|
|
var a := e.Attribute('time');
|
|
if a = nil then
|
|
result := new TimeSpan(24, 0, 0)
|
|
else
|
|
result := TimeSpan(a);
|
|
end)
|
|
.Aggregate(TimeSpan.Zero, (a, e) -> a + e)));
|
|
d.Save(name);
|
|
end.
|
|
[57]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.5. Ðàáîòà ñ ïðîñòðàíñòâàìè èìåí XML-äîêóìåíòà
|
|
// LinqXml57: ïðàâèëüíîå ðåøåíèå (ñ.263)
|
|
begin
|
|
Task('LinqXml57');
|
|
var name := ReadString;
|
|
var s1 := ReadString;
|
|
var s2 := ReadString;
|
|
var d := XDocument.Load(name);
|
|
d.Root.Add(new XAttribute(XNamespace.Xmlns + 'x', s1),
|
|
new XAttribute(XNamespace.Xmlns + 'y', s2));
|
|
var ns1 := XNamespace(s1);
|
|
var ns2 := XNamespace(s2);
|
|
foreach var e in d.Descendants() do
|
|
begin
|
|
var ns := e.Ancestors().Count() <= 1 ? ns1 : ns2;
|
|
e.Name := ns + e.Name.LocalName;
|
|
end;
|
|
d.Descendants().Attributes('xmlns').Remove();
|
|
d.Save(name);
|
|
end.
|
|
[61]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.6. Äîïîëíèòåëüíûå çàäàíèÿ íà îáðàáîòêó XML-äîêóìåíòîâ
|
|
// LinqXml61: ïðàâèëüíîå ðåøåíèå (ñ.268, ââåðõó)
|
|
begin
|
|
Task('LinqXml61');
|
|
var name := ReadString;
|
|
var d := XDocument.Load(name);
|
|
var ns := d.Root.Name.Namespace;
|
|
d.Root.ReplaceNodes(d.Root.Elements()
|
|
.Select(e -> new XElement(ns + 'time',
|
|
new XAttribute('id', e.Element(ns + 'id').Value),
|
|
new XAttribute('year',
|
|
(DateTime(e.Element(ns + 'date'))).Year),
|
|
new XAttribute('month',
|
|
(DateTime(e.Element(ns + 'date'))).Month),
|
|
e.Element(ns + 'time').Value)));
|
|
d.Save(name);
|
|
end.
|
|
[82]
|
|
// Àáðàìÿí Ì.Ý. ÒÅÕÍÎËÎÃÈß LINQ ÍÀ ÏÐÈÌÅÐÀÕ. Ì.: ÄÌÊ-Ïðåññ, 2014.
|
|
// Ãëàâà 7. Ïðèìåðû ðåøåíèÿ çàäà÷ èç ãðóïïû LinqXml
|
|
// 7.6. Äîïîëíèòåëüíûå çàäàíèÿ íà îáðàáîòêó XML-äîêóìåíòîâ
|
|
// LinqXml82: ïðàâèëüíîå ðåøåíèå (ñ.276)
|
|
begin
|
|
Task('LinqXml82');
|
|
var name := ReadString;
|
|
var d := XDocument.Load(name);
|
|
var ns := d.Root.Name.Namespace;
|
|
var a := d.Root.Elements()
|
|
.Select(e ->
|
|
begin
|
|
var s := e.Name.LocalName.Substring(4).Split('-');
|
|
result := new class
|
|
(
|
|
house := StrToInt(s[0]),
|
|
floor := (StrToInt(s[1]) - 1) mod 36 div 4 + 1,
|
|
debt := double(e)
|
|
);
|
|
end);
|
|
var floors := Range(1, 9);
|
|
d.Root.ReplaceNodes(a.OrderBy(e -> e.house)
|
|
.GroupBy(e -> e.house,
|
|
(k, ee) -> new XElement(ns + ('house' + k),
|
|
floors.GroupJoin(ee, e1 -> e1, e2 -> e2.floor,
|
|
(e1, ee2) -> new XElement(ns + ('floor' + e1),
|
|
new XAttribute('count', ee2.Count()),
|
|
new XAttribute('total-debt',
|
|
Math.Round(ee2.Sum(e -> e.debt), 2)))))));
|
|
d.Save(name);
|
|
end.
|
|
|
|
|
|
|