Linq к XML для KML?

Я нашел ответ, я не узнал логическую причину такого поведения, но данные не были в методе успеха, даже если код statuc был 200. на самом деле это было в ошибке: свойства ajax-запроса. я сделал следующее: вместо успешного добавления данных в элемент html. я сделал это в тексте ответа.

Вот код, прежде чем не работает:

  function GetProfession(elementID) {
$.ajax({
    url: "/Handlers/GlobalHandler.ashx",
    dataType: "JSON",
    contentType: "application/json;charset=utf-8",
    //responseType: ResponseType,
    data: {
        functionName: "GetProfession"
    },
    success: function (data) {
        return $("#" + elementID).html(data);
    }
});
}

Вот тот, который работает

function GetProfession(elementID) {
    $.ajax({
        url: "/Handlers/GlobalHandler.ashx",
        dataType: "JSON",
        contentType: "text/html; charset=utf-8",
        //responseType: ResponseType,
        data: {
            functionName: "GetProfession"
        },
        success: function (data, fata, meta) {
        },
        error: function (err) {
            $("#Profession").html(err.responseText);
            //alert(err.responseText);
        }
    });
}
6
задан valdetero 9 September 2016 в 15:50
поделиться

5 ответов

Благодаря spoon16 и Bruce Murdock для указания на меня в правильном направлении. Код, что spoon16 отправил работы, но вынуждает Вас связать пространство имен с каждым именем элемента, которое не является столь же чистым, как я хотел бы.

Я сделал немного больше поиска, и я выяснил, как это, как предполагается, сделано - это супер кратко, и я люблю новое <...> синтаксис скобки для обращения к элементам XML.

Imports <xmlns:g='http://earth.google.com/kml/2.0'>
Imports System.Xml.Linq

 ...

    Dim Kml As XDocument = XDocument.Load(Server.MapPath("../kmlimport/ga.kml"))
    For Each Placemark As XElement In Kml.<g:Document>.<g:Folder>.<g:Placemark>
        Dim Name As String = Placemark.<g:name>.Value
    Next

Отметьте: g после xmlns в первой строке. Это дает Вам ярлык для обращения к этому пространству имен в другом месте.

Для больше о классе XNamespace, см. документацию MSDN.

1
ответ дан 16 December 2019 в 21:48
поделиться

Ни одно из вышеупомянутого не фиксирует, сделал задание; см. мои комментарии для деталей. Я полагаю, что и spoon16 и Bruce Murdock на правильном пути, так как пространство имен является определенно проблемой.

После дальнейшего поиска с помощью Google я столкнулся с некоторым кодом на этой странице, которая предложила обходное решение: просто разделите атрибут xmlns от исходного XML.

    ' Read raw XML
    Dim RawXml As String = ReadFile("../kmlimport/ga.kml")
    ' HACK: Linq to XML choking on the namespace, just get rid of it
    RawXml = RawXml.Replace("xmlns=""http://earth.google.com/kml/2.0""", "")
    ' Parse XML
    Dim Kml As XDocument = XDocument.Parse(RawXml)
    ' Loop through placemarks
    Dim Placemarks = From Placemark In Kml.<Document>.<Folder>.Descendants("Placemark")
    For Each Placemark As XElement In Placemarks
        Dim Name As String = Placemark.<name>.Value
        ...
    Next

Если кто-либо может отправить рабочий код, который работает с пространством имен вместо того, чтобы уничтожить его, я с удовольствием дам им ответ.

0
ответ дан 16 December 2019 в 21:48
поделиться

У Scott Hanselman есть краткое решение для тех, которые ищут базирующееся решение C#.

XLINQ к поддержке XML в VB9

Кроме того, использование XNamespace пригождается, вместо того, чтобы просто добавить строку. Это немного более формально.

// This code should get all Placemarks from a KML file            
var xdoc = XDocument.Parse(kmlContent);
XNamespace ns = XNamespace.Get("http://earth.google.com/kml/2.0");
var ele = xdoc.Element(ns + "kml").Element(ns + "Document").Elements(ns + "Placemark");
1
ответ дан 16 December 2019 в 21:48
поделиться

Вы, возможно, должны добавить пространство имен к имени XElement

Dim ns as string = "http://earth.google.com/kml/2.0"
dim foo = Kml.Descendants(ns + "Document") 

проигнорируйте любые синтаксические ошибки, я работаю в c#

Вы найдете, что может быть различие в XElement.Name по сравнению с XElement.Name.LocalName/

Я обычно foreach через весь XElements в документе как первый шаг для проверки я использую правильное именование.

C# Здесь является выборкой моего использования, похож, я забыл {}

 private string GpNamespace = 
 "{http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions}";

 var results = admldoc.Descendants(GpNamespace + 
               "presentationTable").Descendants().Select(
                p => new dcPolicyPresentation(p));
0
ответ дан 16 December 2019 в 21:48
поделиться

This works for me in C#:

XDocument doc = XDocument.Load(@"TheFile.kml");

var q = doc.Descendants().Where(x => x.Name.LocalName == "Placemark"); 
6
ответ дан 16 December 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: