/
DataRow.cs
144 lines (129 loc) · 3.36 KB
/
DataRow.cs
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.XPath;
using MetaTech.Library;
namespace ContentExtractor.Core
{
[NineRays.Obfuscator.NotObfuscate]
public class XPathDataRowRule : IDataRowRule
{
public string RowsXPath;
private string SelectPath
{
get
{
string result = XPathInfo.PathWithoutBracets(RowsXPath);
if (result.StartsWith("/"))
result = result.Substring(1);
return result;
}
}
public IDataRow[] GetRows(IXPathNavigable document)
{
if (document != null)
{
XPathNavigator navigator = document.CreateNavigator();
List<XPathDataRow> result = new List<XPathDataRow>();
int pageIndex = 0;
int row = 0;
foreach (XPathNavigator page in XmlHlp.Select(navigator, "/Page"))
{
Uri pageUrl = null;
XPathNavigator url = XmlHlp.SelectSingleNode(page, "@url");
if (url != null)
pageUrl = new Uri(url.Value);
XPathNodeIterator iterator = XmlHlp.Select(page, SelectPath);
if (iterator != null)
foreach (XPathNavigator nav in iterator)
{
result.Add(new XPathDataRow(this, nav.CreateNavigator(), pageUrl, row, pageIndex));
row++;
}
pageIndex++;
}
return result.ToArray();
}
else
return Array<IDataRow>.Empty;
}
public object Clone()
{
XPathDataRowRule result = new XPathDataRowRule();
result.RowsXPath = this.RowsXPath;
return result;
}
public override bool Equals(object obj)
{
if (obj is XPathDataRowRule)
{
XPathDataRowRule other = (XPathDataRowRule)obj;
return this.RowsXPath == other.RowsXPath;
}
return false;
}
public override int GetHashCode()
{
return this.RowsXPath.GetHashCode();
}
}
public class XPathDataRow : IDataRow
{
public XPathDataRow(XPathDataRowRule rule, IXPathNavigable row, Uri uri, int rowIndex, int pageIndex)
{
this.rule = rule;
this.row = row;
this.PageUri = uri;
this.RowIndex = rowIndex;
this.PageIndex = pageIndex;
}
private XPathDataRowRule rule;
private IXPathNavigable row;
public IDataRowRule ParentRule
{
get { return rule; }
}
public readonly Uri PageUri;
public readonly int RowIndex;
public readonly int PageIndex;
public object Value
{
get { return row; }
}
}
public class NamesDataRowRule : IDataRowRule
{
public IDataRow[] GetRows(IXPathNavigable document)
{
return new IDataRow[] { new NamesDataRow(this) };
}
public object Clone()
{
return new NamesDataRowRule();
}
public override bool Equals(object obj)
{
return obj is NamesDataRowRule;
}
public override int GetHashCode()
{
return 0;
}
}
public class NamesDataRow : IDataRow
{
public NamesDataRow(NamesDataRowRule parent)
{
this.Parent = parent;
}
private NamesDataRowRule Parent;
public IDataRowRule ParentRule
{
get { return Parent; }
}
public object Value
{
get { return "Names"; }
}
}
}