private static XElement XmlParse(XDocument projDefinition, string referenceType, Func <XElement, bool> whereCondition = null) { XNamespace xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"; XElement packageReferenceElement; if (projDefinition.Root.Attribute("xmlns") != null) { packageReferenceElement = projDefinition ?.Element(xmlns + "Project") ?.Elements(xmlns + "ItemGroup") ?.Elements(xmlns + referenceType) .Where(x => whereCondition == null ? true : whereCondition(x)) .FirstOrDefault(); } else { packageReferenceElement = projDefinition ?.Element("Project") ?.Elements("ItemGroup") ?.Elements(referenceType) .Where(x => whereCondition == null ? true : whereCondition(x)) .FirstOrDefault(); } return(packageReferenceElement); }
/// <summary> /// Parse the app cast XML string into a list of <see cref="AppCastItem"/> objects. /// When complete, the Items list should contain the parsed information /// as <see cref="AppCastItem"/> objects. /// </summary> /// <param name="appCast">the non-null string XML app cast</param> protected virtual void ParseAppCast(string appCast) { const string itemNode = "item"; Items.Clear(); XDocument doc = XDocument.Parse(appCast); var rss = doc?.Element("rss"); var channel = rss?.Element("channel"); Title = channel?.Element("title")?.Value ?? string.Empty; Language = channel?.Element("language")?.Value ?? "en"; var items = doc.Descendants(itemNode); foreach (var item in items) { var currentItem = AppCastItem.Parse(_config.InstalledVersion, _config.ApplicationName, _castUrl, item, _logWriter); _logWriter.PrintMessage("Found an item in the app cast: version {0} ({1}) -- os = {2}", currentItem?.Version, currentItem?.ShortVersion, currentItem.OperatingSystemString); Items.Add(currentItem); } // sort versions in reverse order Items.Sort((item1, item2) => - 1 * item1.CompareTo(item2)); }
public Nuspec GetNuspec() { using (var zipArchive = System.IO.Compression.ZipFile.Open(_packagePath, System.IO.Compression.ZipArchiveMode.Read)) { var nuspecFileName = $"{_packageName}.nuspec"; var zipArchiveEntry = zipArchive.GetEntry(nuspecFileName); var nuspecFileStream = zipArchiveEntry.Open(); XDocument document = null; document = XDocument.Load(nuspecFileStream); var nsNs = XNamespace.Get("http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"); var dependencies = document?.Element(nsNs + "package")?.Element(nsNs + "metadata")?.Element(nsNs + "dependencies")?.Elements(nsNs + "dependency") .Select(e => new NuspecDependency() { Name = e.Attribute("id")?.Value, Version = e.Attribute("version")?.Value }); var nuspec = new Nuspec { Name = _packageName, Dependencies = dependencies?.Where(d => d != null).ToArray() ?? new NuspecDependency[0], Version = _version, }; return(nuspec); } }
public async Task RequestExtract(CancellationToken token, string id, ExtractType type, string extractorPath) { try { string extracttype = type switch { ExtractType.Full => "complete", ExtractType.Incremental => "incremental", _ => "incremental" }; string request_string = $"{_settings.GisServerUrl}?request=export&export_type={extracttype}&path={Uri.EscapeDataString(extractorPath)}&correlation_id={id}"; var method = new HttpMethod("GET"); var request = new HttpRequestMessage(method, request_string); var res = await client.SendAsync(request); var message = await res.Content.ReadAsStringAsync(); XDocument doc = XDocument.Parse(message); if (res.StatusCode == System.Net.HttpStatusCode.OK && doc?.Element("return")?.Element("service_response")?.Element("status")?.Value == "OK") { await CheckForIdfOutput(extractorPath, token); } else { throw new ExtractorException($"Could not trigger an extract. Message from gis server:{message}"); } } catch (Exception ex) { throw new ExtractorException("Exception occured during extraction, see inner exception for details", ex); } }
public static MapLocation ManageGeolocationResponse(XDocument response) { var geocodeResponse = response?.Element("GeocodeResponse"); var result = geocodeResponse?.Element("result"); var geometry = result?.Element("geometry"); var location = geometry?.Element("location"); if (location == null) { return(null); } var latitude = location.Element("lat"); var longitude = location.Element("lng"); if (latitude == null || longitude == null) { return(null); } return(new MapLocation() { Latitude = latitude.Value, Longitude = longitude.Value }); }
public MorningReportInfo FindMorningReport(XDocument rss) { var item = rss?.Element("rss") ?.Element("channel") ?.Element("item"); if (item == null) { return(null); } var title = item.Element("title")?.Value; var date = Utils.ParseDate(item.Element("pubDate")?.Value); var author = item.Element("{http://purl.org/dc/elements/1.1/}creator")?.Value; var contents = item.Element("{http://purl.org/rss/1.0/modules/content/}encoded")?.Value; var doc = ConvertHtmlToXml(contents); if (doc == null) { return(null); } return(new MorningReportInfo { Title = title, Date = date ?? DateTime.UtcNow.Date, Author = author, Document = doc }); }
public static bool TryParseRss20Feed(XDocument document, out Rss20Feed parsedFeed, ExtensionManifestDirectory extensionManifestDirectory = null) { parsedFeed = default; var rssElement = document?.Element("rss"); if (rssElement == null) { return(false); } var rssVersion = rssElement.Attribute("version")?.Value; if (!Rss20Constants.RecognizedVersions.Contains(rssVersion)) { return(false); } if (extensionManifestDirectory == null) { extensionManifestDirectory = ExtensionManifestDirectory.DefaultForRss; } if (!TryParseRss20Channel(rssElement.Element("channel"), extensionManifestDirectory, out var parsedChannel)) { return(false); } parsedFeed = new Rss20Feed(); parsedFeed.Channel = parsedChannel; return(true); }
private static XElement GetCardRoot(XDocument xDocument) { return(xDocument? .Element("DB")? .Element("Geraeteeintraege")? .Element("Geraete")? .Element("ECELMKartenEintraege")); }
private async Task UpdateTotalPostCount() { XDocument document = await GetApiPageAsync(1); int totalPosts; int.TryParse(document?.Element("tumblr").Element("posts").Attribute("total").Value, out totalPosts); blog.Posts = totalPosts; }
private async Task <ulong> GetHighestPostId() { XDocument document = await GetApiPageAsync(1); ulong highestId; ulong.TryParse(document?.Element("tumblr").Element("posts").Element("post")?.Attribute("id").Value, out highestId); return(highestId); }
public static int GetProjectNumber(XDocument xDocument) { var idElement = xDocument? .Element("DB")? .Element("ProjektKopfdaten")? .Element("Projekt")? .Attribute("id"); return(idElement != null ? (int)idElement : 0); }
private static List <XElement> LoadFileIncludes(XDocument projectXml) { var items = projectXml ?.Element(XmlNamespace + "Project") ?.Elements(XmlNamespace + "ItemGroup") .ToList() ?? new List <XElement>(); return(items); }
public void ThenItShouldWrapTheRequestInASoapPackage(ProviderQueryRequest request) { var serializer = new RequestSerializer(); var actual = serializer.Serialize(request); XDocument doc = XDocument.Parse(actual); Assert.IsNotNull(doc.Root.Name == RequestSerializer.SoapNs + "Envelope"); Assert.IsNotNull(doc? .Element(RequestSerializer.SoapNs + "Envelope")? .Element(RequestSerializer.SoapNs + "Header")); Assert.IsNotNull(doc? .Element(RequestSerializer.SoapNs + "Envelope")? .Element(RequestSerializer.SoapNs + "Body")); Assert.IsNotNull(doc? .Element(RequestSerializer.SoapNs + "Envelope")? .Element(RequestSerializer.SoapNs + "Body")? .Element(RequestSerializer.UkrlpNs + "ProviderQueryRequest")); }
private static bool TryReadFromPropertyGroup(XDocument document, string tag, XNamespace @namespace, out string value) { value = document ?.Element(@namespace + "Project") ?.Elements(@namespace + "PropertyGroup") ?.Elements(@namespace + tag) ?.FirstOrDefault() ?.Value ?? string.Empty; return(value != string.Empty); }
private void ExtractPackageConfiguration(Project definition, XDocument nuspec, XNamespace ns) { var metadata = nuspec?.Element(ns + "package")?.Element(ns + "metadata"); if (metadata != null) { var id = metadata.Element(ns + "id")?.Value; if (id == "$id$") { id = null; } var version = metadata.Element(ns + "version")?.Value; if (version == "$version$") { version = null; } definition.PackageConfiguration = new PackageConfiguration { Id = id, Version = version, Authors = ReadValueAndReplace(metadata, ns + "authors", definition.AssemblyAttributes), Description = ReadValueAndReplace(metadata, ns + "description", definition.AssemblyAttributes), Copyright = ReadValueAndReplace(metadata, ns + "copyright", definition.AssemblyAttributes), LicenseUrl = ReadValueAndReplace(metadata, ns + "licenseUrl", definition.AssemblyAttributes), ProjectUrl = ReadValueAndReplace(metadata, ns + "projectUrl", definition.AssemblyAttributes), IconUrl = ReadValueAndReplace(metadata, ns + "iconUrl", definition.AssemblyAttributes), Tags = ReadValueAndReplace(metadata, ns + "tags", definition.AssemblyAttributes), ReleaseNotes = ReadValueAndReplace(metadata, ns + "releaseNotes", definition.AssemblyAttributes), RequiresLicenseAcceptance = metadata.Element(ns + "requireLicenseAcceptance")?.Value != null?bool.Parse(metadata.Element(ns + "requireLicenseAcceptance")?.Value) : false }; var dependencies = metadata.Element(ns + "dependencies")?.Elements(ns + "dependency"); if (dependencies != null) { foreach (var dependency in dependencies) { var packageId = dependency.Attribute("id").Value; var constraint = dependency.Attribute("version").Value; var packageReference = definition.PackageReferences?.FirstOrDefault(x => x.Id.Equals(packageId, StringComparison.OrdinalIgnoreCase)); if (packageReference != null) { packageReference.Version = constraint; } } } } }
/// <summary> /// Обработва отговорите на ЕИСПП /// </summary> /// <returns></returns> private async Task ProcessReplies() { foreach (var item in eisppReplies) { try { XDocument message = XDocument.Parse(item); string correlationId = message?.Descendants("Property") .Where(e => e.Attribute("name")?.Value == "correlation_id") .Select(e => e.Attribute("value")?.Value) .FirstOrDefault(); XElement result = message?.Element("EISPPMessage")?.Element("EISPPPAKET")?.Element("DATA")?.Element("RZT"); XElement exception = result?.Element("Exception"); XElement htmlCard = result?.Element("KartaNPR"); if (correlationId != null) { string eisppNumber = result ?.Descendants() .Where(e => e.NodeType == System.Xml.XmlNodeType.Attribute) .Where(a => a.Name == "nprnmr") .Select(a => a.Value) .FirstOrDefault() ?? ""; await SaveResponse(correlationId, item, eisppNumber); if (exception != null) { SetError(correlationId, exception.Value); } else if (htmlCard != null) { await SaveCard(correlationId, htmlCard.Value, eisppNumber); } else if (result != null) { SetOk(correlationId); } else { SetError(correlationId, "Липсва отговор от ЕИСПП!"); } } } catch (Exception ex) { logger.LogError(ex, "Error processing replies!"); } } }
public static Config LoadConfig(string location, string key) { if (_configStore.ContainsKey(key)) { return((Config)_configStore[key]); } else { XDocument xdoc = XDocument.Load(location); var config = new Config() { TimeToSell = int.Parse(xdoc?.Element("Settings")?.Element("TimeToSell")?.Value ?? "5") }; return(config); } }
public PodcastInfo[] FindPodcasts(XDocument rss) { return(rss?.Element("rss") ?.Element("channel") ?.Elements("item") ?.Take(_podcastsLimit) ?.Select(item => { return new PodcastInfo { Title = item.Element("title").Value, Date = Utils.ParseDate(item.Element("pubDate").Value) ?? DateTime.UtcNow.Date, Url = item.Element("enclosure").Attribute("url").Value.Replace("http://", "https://"), Token = item.Element("guid").Value }; }) ?.ToArray() ?? new PodcastInfo[0]); }
private PackageConfiguration ExtractPackageConfiguration( XDocument nuspec, XNamespace ns ) { var metadata = nuspec?.Element(ns + "package")?.Element(ns + "metadata"); if (metadata == null) { return(null); } var id = metadata.Element(ns + "id")?.Value; if (id == "$id$") { id = null; } var version = metadata.Element(ns + "version")?.Value; if (version == "$version$") { version = null; } var dependencies = metadata.Element(ns + "dependencies") ?.Elements(ns + "dependency") .ToList(); var packageConfig = new PackageConfiguration { Id = id, Version = version, Authors = GetElement(metadata, ns + "authors"), Description = GetElement(metadata, ns + "description"), Copyright = GetElement(metadata, ns + "copyright"), LicenseUrl = GetElement(metadata, ns + "licenseUrl"), ProjectUrl = GetElement(metadata, ns + "projectUrl"), IconUrl = GetElement(metadata, ns + "iconUrl"), Tags = GetElement(metadata, ns + "tags"), ReleaseNotes = GetElement(metadata, ns + "releaseNotes"), RequiresLicenseAcceptance = metadata.Element(ns + "requireLicenseAcceptance")?.Value != null && bool.Parse(metadata.Element(ns + "requireLicenseAcceptance")?.Value), Dependencies = dependencies }; return(packageConfig); }
public static XDocument SetXmlValue(XDocument document, string element, string value) { var xElements = document?.Element("body")?.Elements().Where(xEle => xEle.Name == element); if (xElements == null) { return(document); } { foreach (var xEle in xElements) { xEle.Value = value; document.Save(SettingHandler.SettingPath()); } } return(document); }
public static string GrabXmlValue(XDocument document, string element) { var value = ""; var xElements = document?.Element("body")?.Elements().Where(xEle => xEle?.Name == element); if (xElements == null) { return(value); } { foreach (var xEle in xElements) { value = xEle.Value; return(value); } } return(value); }
public void NianTest() { if (File.Exists("NianTest.db")) { File.Delete("NianTest.db"); } Assert.IsTrue(File.Exists("AccountData.xml"), "AccountData.xml Not Found"); XDocument doc = XDocument.Load("AccountData.xml"); var root = doc?.Element("AccountData")?.Element("NianTest"); Assert.IsNotNull(root, "No NianTest Node"); Assert.IsNotNull(root.Element("UserName"), "UserName not found"); Assert.IsNotNull(root.Element("PassWord"), "PassWord Not Found"); AutoResetEvent isFetched = new AutoResetEvent(false); //Init Database { var db = new LiteDatabase("NianTest.db"); var col = db.GetCollection <NianData>(); var data = new NianData(); data.ListItems = new Dictionary <string, string>(); data.Dreams = new List <DreamInfo>(); col.Insert(data); } var nian = new NianObserver.NianStalker() { Alias = "NianTest", DiffDetected = (string a, string b, string c, string d) => { isFetched.Set(); }, IsTest = true, UserName = root.Element("UserName").Value, PassWord = root.Element("PassWord").Value, TargetUID = 777777 //普通的一个用户(明明有神id却不用念了xxxx) }; nian.Start(); if (!isFetched.WaitOne(10000)) { Assert.Fail(); } }
/// <summary> /// Retreive the project references from new csproj file format /// </summary> /// <param name="projectPath">The Project Path</param> /// <returns></returns> private IEnumerable <string> GetProjectReferencesFromNewProjectFile(string projectPath) { IEnumerable <string> references = new List <string>(); XDocument projDefinition = XDocument.Load(projectPath); try { references = projDefinition ?.Element("Project") ?.Elements("ItemGroup") ?.Elements("PackageReference") ?.Select(refElem => (refElem.Attribute("Include") == null ? "" : refElem.Attribute("Include").Value) + "," + (refElem.Attribute("Version") == null ? "" : refElem.Attribute("Version").Value)); } catch (System.Exception ex) { throw ex; } return(references); }
public void MailTest() { if (File.Exists("MailTest.db")) { File.Delete("MailTest.db"); } if (File.Exists("MailTerminal.shortcut")) { File.Delete("MailTerminal.shortcut"); } Assert.IsTrue(File.Exists("AccountData.xml"), "AccountData.xml Not Found"); XDocument doc = XDocument.Load("AccountData.xml"); var root = doc?.Element("AccountData")?.Element("MailTest"); Assert.IsNotNull(root, "No MailTest Node"); var mail = new OutputTerminal.MailTerminal() { MailHost = root.Element("MailHost").Value, MailPort = int.Parse(root.Element("MailPort").Value), MailUName = root.Element("MailUName").Value, MailPWord = root.Element("MailPWord").Value, MailSender = root.Element("MailSender").Value, MailTarget = root.Element("MailTarget").Value, MailSSL = root.Element("MailSSL")?.Value == "true", Alias = "MailTerminal", Interval = 60000 }; var diffdb = new OutputTerminal.DiffDatabase() { Alias = "MailTest", DatabaseSource = src => { mail.GetDatabase(src); } }; diffdb.Start(); diffdb.InputData("http://Saigetsu.moe", "测试", "测试", "MailTest"); mail.Start(); Thread.Sleep(5000); Assert.IsTrue(mail.IsWaitingForNextRound); Assert.IsTrue(mail.ServiceStatus); }
public static LocalizedAssembly FromXml(Assembly assembly, CultureInfo cultureInfo, XDocument?doc, Dictionary <string, string>?replacements /*new -> old*/) { Dictionary <string, XElement>?file = doc?.Element("Translations").Elements("Type") .Select(x => KeyValuePair.Create(x.Attribute("Name").Value, x)) .Distinct(x => x.Key) .ToDictionary(); var result = new LocalizedAssembly { Assembly = assembly, Culture = cultureInfo, IsDefault = GetDefaultAssemblyCulture(assembly) == cultureInfo.Name }; result.Types = (from t in assembly.GetTypes() let opts = GetDescriptionOptions(t) where opts != DescriptionOptions.None let x = file?.TryGetC(replacements?.TryGetC(t.Name) ?? t.Name) select LocalizedType.ImportXml(t, opts, result, x)) .ToDictionary(lt => lt.Type); return(result); }
private void Game_UpdateFrame(object sender, FrameEventArgs e) { PreviousMouseState = MouseState; PreviousKeyboardState = KeyboardState; MouseState = OpenTK.Input.Mouse.GetState(); KeyboardState = OpenTK.Input.Keyboard.GetState(); PreviousMousePosition = MousePosition; #if GRAPHMAKER XDocument doc = new XDocument(); doc.Add(new XElement("Waypoints")); if (MouseState.LeftButton == ButtonState.Pressed && PreviousMouseState.LeftButton == ButtonState.Released) { int x = Camera.X + MousePosition.X; int y = Camera.Y + MousePosition.Y; if (MouseState.LeftButton == ButtonState.Pressed && PreviousMouseState.LeftButton == ButtonState.Released && MousePosition.X > 40) { doc.Element("Waypoints").Add(new XElement("Waypoint", new XAttribute("X", x), new XAttribute("Y", y))); minID++; Minion markerMinion = new Minion(new List<Sprite>() { new Sprite(new List<string>() { "Images/BlueMinion.png" }), new Sprite(new List<string>() { "Images/BlueMinion0.png", "Images/BlueMinion1.png" }) }, minID); markerMinion.Pos.X = x; markerMinion.Pos.Y = y; _player1.AddMinion(markerMinion); // doc.Save("TestWaypoint.xml"); XDocument doc = new XDocument(); doc.Add(new XElement("Waypoints")); if (MouseState.LeftButton == ButtonState.Pressed && PreviousMouseState.LeftButton == ButtonState.Released) { } if (MouseState.RightButton == ButtonState.Pressed && PreviousMouseState.RightButton == ButtonState.Released && MousePosition.X > 40) { switch (rightClicks) { case 0: clicks[0] = x; clicks[1] = y; break; case 1: clicks[2] = x; clicks[3] = y; minID++; Minion markerMinion = new Minion(new List<Sprite>() { new Sprite(new List<string>() { "Images/square.png" }), new Sprite(new List<string>() { "Images/square.png", "Images/square.png" }) }, minID); WaypointNode waypoint1 = graph.GetClosestWaypoint(clicks[0], clicks[1]); WaypointNode waypoint2 = graph.GetClosestWaypoint(clicks[2], clicks[3]); markerMinion.Pos.X = waypoint1.X + (waypoint2.X - waypoint1.X) / 2; markerMinion.Pos.Y = waypoint1.Y + (waypoint2.Y - waypoint1.Y) / 2; _player1.AddMinion(markerMinion); graph.ConnectNodes(waypoint1, waypoint2); Console.Write("Added neighbor"); break; } rightClicks++; rightClicks = rightClicks % 2; graph.WriteGraph("TestWaypointNeighbors.xml"); } _scrollBar.Update(e.Time); #else _map.Update(e.Time); _ui.Update(e.Time); #endif } private void Mouse_Move(object sender, MouseMoveEventArgs e) { MousePosition = e.Position; } } }
private void AssertXDocument(XDocument document, int expectedNumber, string expectedText) { Assert.Equal(expectedNumber.ToString(), document?.Element("TestModel")?.Element("Number")?.Value); Assert.Equal(expectedText, document?.Element("TestModel")?.Element("Text")?.Value); }
private static Dictionary <string, string> ParsePackageVersions(XDocument packagesDocument, string repoName) { var props = new Dictionary <string, string>(); IEnumerable <XElement> propGroups = packagesDocument?.Element("Project")?.Elements("PropertyGroup"); if (propGroups != null) { foreach (XElement propGroup in propGroups) { if (propGroup.Attribute("Condition") != null) { WriteWarning($"{repoName} Packages.prop has Conditional PropertyGroup, which is not supported"); continue; } foreach (XElement prop in propGroup.Elements()) { if (prop.Attribute("Condition") != null) { WriteWarning( $"{repoName} Packages.prop property {prop.Name.LocalName} has Conditional Property, which is not supported"); continue; } props[prop.Name.LocalName] = prop.Value; } } } var versions = new Dictionary <string, string>(); IEnumerable <XElement> packageReferences = packagesDocument?.Element("Project") ?.Elements("ItemGroup") ?.Elements("PackageReference"); if (packageReferences == null) { WriteError($"No PackageReferences found in {repoName} Packages.props"); } else { foreach (XElement packageRef in packageReferences) { string name = packageRef.Attribute("Update")?.Value; string version = packageRef.Attribute("Version")?.Value; if (string.IsNullOrEmpty(name)) { WriteWarning($"PackageReference with no 'Update' found in Packages.props for repo {repoName}"); continue; } if (string.IsNullOrEmpty(version)) { WriteWarning( $"PackageReference with no 'Version' for Package '{name}' found in Packages.props for repo {repoName}"); continue; } version = Regex.Replace(version, @"\$\(([A-Za-z0-9_]*)\)", m => props.GetValueOrDefault(m.Groups[1].Value, m.Groups[0].Value)); versions.Add(name, version); } } return(versions); }
public static bool TryParseRss10Feed(XDocument document, out Rss10Feed parsedFeed, ExtensionManifestDirectory extensionManifestDirectory = null) { parsedFeed = default; var rdfElement = document?.Element(_rdf + "RDF"); if (rdfElement == null) { return(false); } var rssNamespace = rdfElement.Attribute("xmlns")?.Value; XNamespace rss = null; foreach (var ns in Rss10Constants.RecognizedNamespaces) { rss = ns; if (rssNamespace == ns.NamespaceName) { break; } } if (rss == null) { return(false); } if (extensionManifestDirectory == null) { extensionManifestDirectory = ExtensionManifestDirectory.DefaultForRss; } if (!TryParseRss10Channel(rdfElement.Element(rss + "channel"), rss, extensionManifestDirectory, out var parsedChannel)) { return(false); } if (TryParseRss10Image(rdfElement.Element(rss + "image"), rss, extensionManifestDirectory, out var parsedImage)) { parsedChannel.Image = parsedImage; } if (TryParseRss10TextInput(rdfElement.Element(rss + "textinput"), rss, extensionManifestDirectory, out var parsedTextInput)) { parsedChannel.TextInput = parsedTextInput; } // items foreach (var itemElement in rdfElement.Elements(rss + "item")) { if (TryParseRss10Item(itemElement, rss, extensionManifestDirectory, out var parsedItem)) { parsedChannel.Items.Add(parsedItem); } } parsedFeed = new Rss10Feed(); parsedFeed.Channel = parsedChannel; return(true); }
public static bool TryParseAtom10Feed(XDocument document, out Atom10Feed parsedFeed, ExtensionManifestDirectory extensionManifestDirectory = null) { parsedFeed = default; XElement feedElement = null; XNamespace atom = null; foreach (var ns in Atom10Constants.RecognizedNamespaces) { atom = ns; feedElement = document?.Element(atom + "feed"); if (feedElement != null) { break; } } if (feedElement == null) { return(false); } if (extensionManifestDirectory == null) { extensionManifestDirectory = ExtensionManifestDirectory.DefaultForAtom; } parsedFeed = new Atom10Feed(); parsedFeed.Lang = feedElement.Attribute(_xml + "lang")?.Value; parsedFeed.Base = feedElement.Attribute(_xml + "base")?.Value; parsedFeed.Id = feedElement.Element(atom + "id")?.Value.Trim(); if (TryParseAtom10Text(feedElement.Element(atom + "title"), out var parsedTitle)) { parsedFeed.Title = parsedTitle; } if (TryParseAtom10Timestamp(feedElement.Element(atom + "updated"), out var parsedUpdated)) { parsedFeed.Updated = parsedUpdated; } foreach (var authorElement in feedElement.Elements(atom + "author")) { if (TryParseAtom10Person(authorElement, atom, out var parsedPerson)) { parsedFeed.Authors.Add(parsedPerson); } } foreach (var linkElement in feedElement.Elements(atom + "link")) { if (TryParseAtom10Link(linkElement, out var parsedLink)) { parsedFeed.Links.Add(parsedLink); } } foreach (var categoryElement in feedElement.Elements(atom + "category")) { if (TryParseAtom10Category(categoryElement, out var parsedCategory)) { parsedFeed.Categories.Add(parsedCategory); } } foreach (var contributorElement in feedElement.Elements(atom + "contributor")) { if (TryParseAtom10Person(contributorElement, atom, out var parsedPerson)) { parsedFeed.Contributors.Add(parsedPerson); } } if (TryParseAtom10Generator(feedElement.Element(atom + "generator"), out var parsedGenerator)) { parsedFeed.Generator = parsedGenerator; } parsedFeed.Icon = feedElement.Element(atom + "icon")?.Value.Trim(); parsedFeed.Logo = feedElement.Element(atom + "logo")?.Value.Trim(); if (TryParseAtom10Text(feedElement.Element(atom + "rights"), out var parsedRights)) { parsedFeed.Rights = parsedRights; } if (TryParseAtom10Text(feedElement.Element(atom + "subtitle"), out var parsedSubtitle)) { parsedFeed.Subtitle = parsedSubtitle; } // entries foreach (var entryElement in feedElement.Elements(atom + "entry")) { if (TryParseAtom10Entry(entryElement, atom, extensionManifestDirectory, out var parsedEntry)) { parsedFeed.Entries.Add(parsedEntry); } } // extensions ExtensibleEntityParser.ParseXElementExtensions(feedElement, extensionManifestDirectory, parsedFeed); return(true); }
public IEnumerable <TootSpan> Parse(MastodonStatus status) { var content = status.Content; var encoding = Encoding.UTF8; var parsedSpans = new List <TootSpan>(); // なんか一応 div で囲ってみてる(今のところ <p></p> で囲まれてるtootしかみたことないけど) using (var stream = new MemoryStream(encoding.GetBytes("<div>" + content.Replace("<br>", "<br/>") + "</div>"))) using (var reader = new SgmlReader(stream)) { XDocument doc = XDocument.Load(reader); //Console.WriteLine("start----"); //Console.WriteLine("raw--"); //Console.WriteLine(content); //Console.WriteLine("--raw"); // 最初に見つかった XText の Node の親の Node群を列挙する → いきなり @amay とかで始まるとだめだー //var firstTextNode = doc.DescendantNodes().FirstOrDefault(node => node is XText); //var contentRoot = firstTextNode?.Parent?.Nodes() // しょうがないので決め打ち;(SgmlReader にしたら勝手に <html></html> が付いた) var contentRoot = doc?.Element("html")?.Element("div")?.Element("p") ?? null; foreach (var node in contentRoot?.Nodes() ?? new XNode[0]) { if (node.NodeType == XmlNodeType.Text) { var xText = node as XText; parsedSpans.Add(TootSpan.MakeText(xText.Value)); //Console.WriteLine($"text - {xText.Value}"); } else if (node.NodeType == XmlNodeType.Element) { var element = node as XElement; switch (element.Name.LocalName.ToLower()) { case "a": { var span = ParseLink(element, status.MediaAttachments, status.Tags); parsedSpans.Add(span); break; } case "br": { parsedSpans.Add(TootSpan.MakeLineBreak()); break; } case "span": { // なんか @amay みたいなメンションは span になるらしいが判別できないのでただの Text とする parsedSpans.Add(TootSpan.MakeText(element.Value)); break; } default: { //Console.WriteLine("Unknown Element: [" + element.Name + "]" + element.Value); throw new NotSupportedException($"Unknown Element: [{element.Name}]{element.Value} - {status.Id}"); break; } } } else { // Unknown XNode //Console.WriteLine($"Unknown Node: {node}"); throw new NotSupportedException($"Unknown Node: {node} - {status.Id}"); } } //Console.WriteLine("----end"); } return(parsedSpans); }