pascalabcnet/ReleaseGenerators/PT4/Lib/PT4LinqXml[PascalABC].txt
2015-08-31 21:07:40 +03:00

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.