Выходные данные JSON Census Geocoder преобразуются в набор данных Xml с использованием JSON.net в C #
Я создаю .Net-приложение в Visual Studio 2012, которое запрашивает таблицу адресов в моем дБ SQL и использует API геокодирования Census для возврата конкретного MSA для каждого адреса. У меня есть существующий код для запроса дБ, но у меня возникают проблемы с преобразованием вывода Json API Census в набор данных Xml. Я использую Json.net для сериализации вывода json, а затем десериализации в .net для загрузки в XmlDocument. К сожалению, я получаю сообщение об ошибке XmlException:
Данные на корневом уровне недействительны. Линия 1, позиция 1
Подробности:
System.Xml.XmlException не было обработано HResult = -2146232000
Сообщение = Данные на корневом уровне недействительны. Строка 1, позиция 1.
Source = System.Xml LineNumber = 1 LinePosition = 1 SourceUri = ""
StackTrace: в System.Xml.XmlTextReaderImpl.Throw (исключение e) в System.Xml.XmlTextReaderImpl.Throw (String res, String arg) в System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace () в System.XT. System.Xml.XmlTextReaderImpl.Read () в System.Xml.XmlLoader.Load (XmlDocument doc, читатель XmlReader, логическое preserveWhitespace) в System.Xml.XmlDocument.Load (читатель XmlReader) в System.Xml.XmlDocument.oad ) в ConsoleApplication1.Program.Main (String [] args) в c: \ Users \ jdsmith \ Documents \ Visual Studio 2012 \ Projects \ C # \ MSA_Application_v2 \ MSA_Application_v2 \ Model \ Program.cs: строка 54 в System.AppDomain._nExecuteAssembly ( Сборка RuntimeAssembly, String [] args) в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence AssemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThxtStart_ в System.Threading.ExecutionContext.RunIntern al (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run (обратный вызов ExecutionContext executeContext, ContextCallback, состояние объекта, Boolean preserveSyncCtx) в System.Threading.ExbacktionContext.Tun Состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:
Я считаю, что Json или Xml необходимо отформатировать дальше, но я не знаю как. Кроме того, я уверен, что я делаю это слишком сложным для себя ... если есть лучший способ, я весь слух.
Вот пример geolookup, который я использую для тестирования:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Data;
using System.Net;
using System.IO;
using System.Xml;
using System.Runtime.Serialization.Json;
using System.Xml.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ConsoleApplication1
{
class Program
{
private static string geoRT = "geographies";
private static string geoST = "address";
private static string geoStreet = "4600+Silver+Hill+Rd";
private static string geoCity = "Suitland";
private static string geoState = "MD";
private static string geoZip = "20746";
private static string geoBM = "Public_AR_Census2010";
private static string geoVin = "Census2010_Census2010";
private static string geoLayer = "all";
private static string geoFormat = "json";
static void Main(string[] args)
{
StringBuilder geoRelURI = new StringBuilder();
geoRelURI.AppendFormat(@"{0}/{1}?street={2}&city={3}&state={4}&zip={5}&benchmark={6}&vintage={7}&layers={8}&format={9}"
, geoRT, geoST, geoStreet, geoCity, geoState, geoZip, geoBM, geoVin, geoLayer, geoFormat);
Uri geoBaseURI = new Uri("http://geocoding.geo.census.gov/geocoder/");
Uri geoURI = new Uri(geoBaseURI, geoRelURI.ToString());
//Console.WriteLine(geoURI);
//Console.ReadLine();
WebRequest geoRequest = WebRequest.Create(geoURI);
WebResponse geoResponse = geoRequest.GetResponse();
Stream geoDataStream = geoResponse.GetResponseStream();
StreamReader geoReader = new StreamReader(geoDataStream);
string geoString = geoReader.ReadToEnd();
var jsonConvert = JsonConvert.SerializeObject(geoString);
string jsonString = jsonConvert.ToString();
var xmlConvert = JsonConvert.DeserializeObject(jsonString);
string xmlString = xmlConvert.ToString();
XmlDocument geoXMLDoc = new XmlDocument();
geoXMLDoc.LoadXml(xmlString);
XmlWriterSettings xmlSettings = new XmlWriterSettings();
xmlSettings.Indent = true;
XmlWriter geoXMLWriter = XmlWriter.Create("geoXML.xml", xmlSettings);
geoXMLDoc.Save(geoXMLWriter);
Console.Write("<BR>" + geoXMLDoc.OuterXml);
//Console.WriteLine(xmlString);
//Console.ReadLine();
geoDataStream.Close();
geoResponse.Close();
}
}
}