Пример #1
0
        public override IDocumentNode VisitAddress(DashParser.AddressContext context)
        {
            var node = new AddressNode
            {
                Id = ((ValueNode <string>)context.addressContent().Accept(this)).Value
            };

            _adresses[node.Id] = node;

            LinkNode[] linksToResolve = _unresolvedLinkAddresses.Where(x => node.Id.Equals(x.Address, StringComparison.OrdinalIgnoreCase)).ToArray();
            foreach (LinkNode link in linksToResolve)
            {
                link.AddressNode = node;
                _unresolvedLinkAddresses.Remove(link);
            }

            return(node);
        }
Пример #2
0
        /// <summary>
        /// 读取文件到缓存
        /// </summary>
        private static void LoadFile(PopType popType)
        {
            if (popType == PopType.TMALL)
            {
                popType = PopType.TAOBAO;
            }
            lock (Address)
            {
                var root = new AddressNode {
                    Type = "Country", Name = "中国", ShortName = "中国"
                };
                XDocument xDoc = XDocument.Load(System.IO.Path.Combine(EnvironmentDirHelper.DIR_DATA, popType + "_Address.xml"));
                foreach (var province in xDoc.Root.Elements())
                {
                    //省
                    AddressNode p = new AddressNode {
                        Name = province.Attribute("Name").Value, ShortName = province.Attribute("ShortName").Value, Type = province.Name.LocalName
                    };
                    root.SubNodes.Add(p);

                    //市或者省直辖行政区
                    foreach (var city in province.Elements())
                    {
                        AddressNode c = new AddressNode {
                            Name = city.Attribute("Name").Value, ShortName = city.Attribute("ShortName").Value, Type = city.Name.LocalName
                        };
                        p.SubNodes.Add(c);

                        //区县,二级市
                        foreach (var district in city.Elements())
                        {
                            c.SubNodes.Add(new AddressNode {
                                Name = district.Attribute("Name").Value, ShortName = district.Attribute("ShortName").Value, Type = district.Name.LocalName
                            });
                        }
                    }
                }
                Address[popType] = root;
            }
        }
Пример #3
0
 public override void VisitAddress(AddressNode node)
 {
     Write("<span id=\"", ToIdentifier(node.Id), "\"></span>");
 }
Пример #4
0
        /// <summary>
        /// 返回省,市,区,镇,详细地址 格式
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public static string[] Parse5Address(string address, PopType sourceType, PopType targetType)
        {
            if (sourceType == PopType.TMALL)
            {
                sourceType = PopType.TAOBAO;
            }
            if (targetType == PopType.TMALL)
            {
                targetType = PopType.TAOBAO;
            }
            if (Address.ContainsKey(sourceType) == false)
            {
                LoadFile(sourceType);
            }
            if (Address.ContainsKey(targetType) == false)
            {
                LoadFile(targetType);
            }

            AddressNode sourceRoot = Address[sourceType];
            AddressNode targetRoot = Address[targetType];
            string      add        = address.Trim();

            string[] adds = new string[] { string.Empty, string.Empty, string.Empty, string.Empty, string.Empty };

            //第一步省
            AddressNode p = sourceRoot.SubNodes.FirstOrDefault(obj => add.StartsWith(obj.Name));

            if (p == null)
            {
                throw new Exception("地址格式错误,无法解析出省:" + add);
            }
            adds[0] = p.Name;
            add     = add.Substring(p.Name.Length).Trim();
            var city = p.SubNodes.FirstOrDefault(obj => add.StartsWith(obj.Name));

            if (city == null)
            {
                throw new Exception("地址格式错误,无法解析出市:" + add);
            }
            if (city.Type == DISTRICT)
            {
                //省级直属区,县
                adds[2] = city.Name;
                add     = add.Substring(city.Name.Length).Trim();
            }
            else
            {
                adds[1] = city.Name;
                add     = add.Substring(city.Name.Length).Trim();
                var district = city.SubNodes.FirstOrDefault(obj => add.StartsWith(obj.Name));
                if (district != null)
                {
                    adds[2] = district.Name;
                    add     = add.Substring(district.Name.Length).Trim();
                }
            }
            //从详细地址删除存在省市区等信息
            for (int i = 0; i <= 2; i++)
            {
                if (string.IsNullOrWhiteSpace(adds[i]))
                {
                    continue;
                }
                if (add.StartsWith(adds[i]))
                {
                    add = add.Substring(adds[i].Length);
                }
            }
            if (sourceType == PopType.PINGDUODUO && targetType == PopType.TAOBAO)
            {
                //这种是直辖市
                if (adds[0].Contains("市"))
                {
                    adds[1] = adds[0];
                    adds[0] = adds[0].Replace("市", "");
                }

                //这种是省下面的直辖区,县
                if (PDD_DIS_MARK.Any(obj => obj == adds[1]))
                {
                    adds[1] = string.Empty;
                }
            }
            adds[4] = add;
            return(adds);
        }
Пример #5
0
 public void Add(AddressNode addressNode)
 {
     address.Add(addressNode);
 }
Пример #6
0
 public abstract void VisitAddress(AddressNode node);