Как я должен поменять эту струну XML так, чтобы XDocument. Синтаксический анализ читает его в?

В следующем коде я сериализирую объект в строку XML.

Но когда я пытаюсь считать эту строку XML в XDocument с XDocument. Синтаксический анализ, это дает мне эту ошибку:

Недопустимые данные на корневом уровне.

XML:

<?xml version="1.0" encoding="utf-8"?>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Id>1</Id>
   <FirstName>Jim</FirstName>
   <LastName>Jones</LastName>
   <ZipCode>23434</ZipCode>
</Customer>

ОБНОВЛЕНИЕ: Вот шестнадцатеричное число:

![alt text][1] Ультрасовременное редактирование - отключенная гиперссылка: ссылки на вредоносное программное обеспечение

Что я должен сделать к этому XML так, чтобы он читал в XDocument без ошибки?

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
using System.Xml;
using System.Text;
using System.Xml.Linq;

namespace TestSerialize2342
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Customer> customers = Customer.GetCustomers();

            Console.WriteLine("--- Serializing ------------------");

            foreach (var customer in customers)
            {
                Console.WriteLine("Serializing " + customer.GetFullName() + "...");
                string xml = XmlHelpers.SerializeObject<Customer>(customer);

                XDocument xdoc = XDocument.Parse(xml);

            }

            Console.ReadLine();
        }

    }

    public static class StringHelpers
    {
        public static String UTF8ByteArrayToString(Byte[] characters)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            String constructedString = encoding.GetString(characters);
            return (constructedString);
        }

        public static Byte[] StringToUTF8ByteArray(String pXmlString)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            Byte[] byteArray = encoding.GetBytes(pXmlString);
            return byteArray;
        } 
    }

    public static class XmlHelpers
    {
        public static string SerializeObject<T>(object o)
        {
            MemoryStream ms = new MemoryStream();
            XmlSerializer xs = new XmlSerializer(typeof(T));
            XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF8);
            xs.Serialize(xtw, o);
            ms = (MemoryStream)xtw.BaseStream;
            return StringHelpers.UTF8ByteArrayToString(ms.ToArray());
        }

        public static T DeserializeObject<T>(string xml)
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(StringHelpers.StringToUTF8ByteArray(xml));
            XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF8);
            return (T)xs.Deserialize(ms);
        }
    }

    public class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Street { get; set; }
        public string Location { get; set; }
        public string ZipCode { get; set; }

        private int internalValue = 23;

        public static List<Customer> GetCustomers()
        {
            List<Customer> customers = new List<Customer>();
            customers.Add(new Customer { Id = 1, FirstName = "Jim", LastName = "Jones", ZipCode = "23434" });
            customers.Add(new Customer { Id = 2, FirstName = "Joe", LastName = "Adams", ZipCode = "12312" });
            customers.Add(new Customer { Id = 3, FirstName = "Jack", LastName = "Johnson", ZipCode = "23111" });
            customers.Add(new Customer { Id = 4, FirstName = "Angie", LastName = "Reckar", ZipCode = "54343" });
            customers.Add(new Customer { Id = 5, FirstName = "Henry", LastName = "Anderson", ZipCode = "16623" });
            return customers;
        }

        public string GetFullName()
        {
            return FirstName + " " + LastName + "(" + internalValue + ")";
        }

    }
}

ОТВЕТ:

Andras спасибо, GetPreamble () зафиксировал его, таким образом, для кого-либо еще имеющего дело с этим, вот немного метода для очистки XML BOM:

public static string RemoveUtf8ByteOrderMark(string xml)
{
    string byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
    if (xml.StartsWith(byteOrderMarkUtf8))
    {
        xml = xml.Remove(0, byteOrderMarkUtf8.Length);
    }
    return xml;
}
10
задан Josh E 15 May 2018 в 18:16
поделиться

3 ответа

Другие возможности для вас - создать сценарий, создающий данные изображения на выход и направьте ссылку на него.

Image.php

$imagedata1 = file_get_contents('assets/test.png');
$imagedata1 = process_using_gd_or_something($imagedata1);

header('Content-type: image/png');
echo $imagedata1;

Другое_Pages.php:

echo "<img src='image.php?some_params'>";

Редактировать: Извините, я пропустил уведомление о том, чтобы не хотеть внешний скрипт, но это решение более эффективно, чем кодирование изображения в Base64.

-121--2081153-

Это связано с тем, что данные содержат Unicode или UTF8 Marks в начале потока.

Вам необходимо пропустить мимо любых знаков заказа байтов в потоке - вы можете идентифицировать их из System.text.encoding.getPreamble () .

15
ответ дан 3 December 2019 в 22:37
поделиться

Установлен ли для параметра Copy Local набор true для ссылки? Щелкните правой кнопкой мыши по ссылке и выберите «Свойства».

-121--3500286-
<html>
<body>
<form target='userCountFrame' action='http://www.google.com'></form>
<iframe name='userCountFrame'></iframe>
<script>
setInterval(function(){
  document.getElementsByTagName('form')[0].submit();
}, 10 * 60 * 1000);
</script>
</body>
</html>

соответствующим образом измените URL-адрес, сохраните указанный выше код как count.html на рабочем столе и откройте его с помощью Firefox

-121--4780343-

Все, что указано выше, является правильным, и вот код, который вы должны использовать вместо вашего, чтобы пропустить BOM:

 public static string SerializeObject<T>(object o)
        {
            MemoryStream ms = new MemoryStream();
            XmlSerializer xs = new XmlSerializer(typeof(T));
            //here is my code
            UTF8Encoding encoding = new UTF8Encoding(false);
            XmlTextWriter xtw = new XmlTextWriter(ms, encoding);
            //XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF8);
            xs.Serialize(xtw, o);
            ms = (MemoryStream)xtw.BaseStream;
            return StringHelpers.UTF8ByteArrayToString(ms.ToArray());
       }

Путем указания false в конструкторе вы говорите «BOM не предоставляется». Наслаждайтесь! =)

-1
ответ дан 3 December 2019 в 22:37
поделиться

Вы можете решить вашу проблему, используя TreamReader , чтобы преобразовать данные в Memoreream в строку вместо этого:

public static string SerializeObject<T>(object o)
{
    using (MemoryStream ms = new MemoryStream())
    {
        XmlSerializer xs = new XmlSerializer(typeof(T));
        using (XmlWriter xtw = XmlWriter.Create(ms))
        {
            xs.Serialize(xtw, o);
            xtw.Flush();
            ms.Seek(0, SeekOrigin.Begin);
            using (StreamReader reader = new StreamReader(ms))
            {
                return reader.ReadToEnd();
            }
        }
    }
}
1
ответ дан 3 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

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