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); }
/// <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; } }
public override void VisitAddress(AddressNode node) { Write("<span id=\"", ToIdentifier(node.Id), "\"></span>"); }
/// <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); }
public void Add(AddressNode addressNode) { address.Add(addressNode); }
public abstract void VisitAddress(AddressNode node);