XmlReader Не читает шестнадцатеричный из Cmd.ExecuteXmlReader () [duplicate]

Я просто столкнулся с той же проблемой, но оказалось, что pip install pyspark загружает искровую разрядку, которая хорошо работает в локальном режиме. Пип просто не подходит SPARK_HOME. Но когда я устанавливаю это вручную, pyspark работает как шарм (без загрузки каких-либо дополнительных пакетов).

$ pip3 install --user pyspark
Collecting pyspark
  Downloading pyspark-2.3.0.tar.gz (211.9MB)
    100% |████████████████████████████████| 211.9MB 9.4kB/s 
Collecting py4j==0.10.6 (from pyspark)
  Downloading py4j-0.10.6-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 3.9MB/s 
Building wheels for collected packages: pyspark
  Running setup.py bdist_wheel for pyspark ... done
  Stored in directory: /home/mario/.cache/pip/wheels/4f/39/ba/b4cb0280c568ed31b63dcfa0c6275f2ffe225eeff95ba198d6
Successfully built pyspark
Installing collected packages: py4j, pyspark
Successfully installed py4j-0.10.6 pyspark-2.3.0

$ PYSPARK_PYTHON=python3 SPARK_HOME=~/.local/lib/python3.5/site-packages/pyspark pyspark
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
2018-03-31 14:02:39 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.3.0
      /_/

Using Python version 3.5.2 (default, Nov 23 2017 16:37:01)
>>>

Надеюсь, что помогает: -)

16
задан abatishchev 14 June 2012 в 19:30
поделиться

6 ответов

Без ваших фактических данных или источника нам будет сложно диагностировать, что происходит неправильно. Тем не менее, я могу сделать несколько советов:

  • Unicode NUL (0x00) является незаконным во всех версиях XML, а проверки синтаксических анализаторов должны отклонять ввод, содержащий его.
  • выше; в реальном мире неаудированный XML может содержать любой вид невразумимых байтов, которые можно вообразить.
  • XML 1.1 допускает нулевые и непечатаемые управляющие символы (кроме NUL), поэтому вы не можете смотреть файл XML 1.1 в текстовом редакторе и указать, какие символы он содержит.

Учитывая то, что вы написали, я подозреваю, что все преобразования данных базы данных в XML нарушены; он распространяет не-XML-символы.

Создайте несколько записей базы данных с не-XML-символами (NUL, DEL, управляющие символы и т. д.) и запустите на нем свой XML-конвертер. Выведите XML в файл и посмотрите на него в шестнадцатеричном редакторе. Если это содержит символы, отличные от XML, ваш конвертер не работает. Исправьте его или, если вы не можете, создадите препроцессор, который отклоняет вывод с такими символами.

Если вывод конвертера выглядит хорошо, проблема в вашем XML-потребителе; он где-то вставляет символы, отличные от XML. Вам придется разбить свой процесс потребления на отдельные этапы, изучить результат на каждом шаге и сузить, что представляет плохие символы.

Обновление: я просто натолкнулся на пример этого сам! Случилось то, что производитель кодировал XML как UTF16, и потребитель ожидал UTF8. Поскольку UTF16 использует 0x00 в качестве старшего байта для всех символов ASCII, а UTF8 - нет, потребитель просматривал каждый второй байт как NUL. В моем случае я мог бы изменить кодировку, но предложил, чтобы все полезные данные XML начинались с спецификации.

18
ответ дан Dour High Arch 23 August 2018 в 23:18
поделиться

Я использую IronPython здесь (так же, как .NET API) и читаю файл как UTF-8, чтобы правильно обрабатывать спецификацию, исправил проблему для меня:

xmlFile = Path.Combine(directory_str, 'file.xml')
doc = XPathDocument(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))

Это сработало бы а также с XmlDocument:

doc = XmlDocument()
doc.Load(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))
1
ответ дан BrunoJCM 23 August 2018 в 23:18
поделиться

Я также получаю ту же ошибку в приложении ASP.NET, когда я сохранил некоторые данные Unicode (хинди) в файле Web.config и сохранил его с кодировкой «Unicode».

Он исправил ошибку для меня, когда я сохранил файл Web.config с кодировкой «UTF-8».

4
ответ дан DEEPAK SHARMA 23 August 2018 в 23:18
поделиться

Чтобы добавить к ответу Зонца выше, после работы для нас.

//Instead of 
XmlString.Replace("�", "[0x00]");
// use this
XmlString.Replace("\x00", "[0x00]");
6
ответ дан Mike-Monkey 23 August 2018 в 23:18
поделиться

В моем случае потребовалось некоторое копирование, но оно было найдено.

Мой контекст

Я просматриваю журналы ошибок / ошибок с веб-сайта, используя Elmah. Elmah возвращает состояние сервера в момент исключения, в виде большого XML-документа.

Во время атаки на веб-сайт я заметил, что некоторые xmls не анализируются и получают это исключение '.', hexadecimal value 0x00, is an invalid character..

НЕ РЕШЕНИЕ: я преобразовал документ в byte[] и дезинфицировал его в 0x00, но не нашел его.

Когда я просматривал документ xml, я нашел следующее:

...
<form>
...
<item name="SomeField">
   <value
     string="C:\boot.ini&#x0;.htm" />
 </item>
...

Был nul-байт, закодированный как объект html &#x0; !!!

. РЕШЕНИЕ: Чтобы исправить кодировку, я заменил значение &#x0; перед загрузкой в ​​мой XmlDocument, потому что при загрузке он создаст нулевой байт, и его будет трудно дезинфицировать от объекта. Вот мой весь процесс:

XmlDocument xml = new XmlDocument();
details.Xml = details.Xml.Replace("&#x0;", "[0x00]");  // in my case I want to see it, otherwise just replace with ""
xml.LoadXml(details.Xml);

string formattedXml = null;

// I have this in a helper function, but for this example I have put it in-line
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true,
    IndentChars = "\t",
    NewLineHandling = NewLineHandling.None,
};
using (XmlWriter writer = XmlWriter.Create(sb, settings)) {
    xml.Save(writer);
    formattedXml = sb.ToString();
}

LESSON LEARNED: санировать за незаконные байты с помощью связанного html-объекта, если ваши входящие данные кодируются html при записи.

9
ответ дан sonjz 23 August 2018 в 23:18
поделиться

В качестве своего рода позднего ответа:

У меня возникла проблема с SSRS ReportService2005.asmx при загрузке отчета.

    Public Shared Sub CreateReport(ByVal strFileNameAndPath As String, ByVal strReportName As String, ByVal strReportingPath As String, Optional ByVal bOverwrite As Boolean = True)
        Dim rs As SSRS_2005_Administration_WithFOA = New SSRS_2005_Administration_WithFOA
        rs.Credentials = ReportingServiceInterface.GetMyCredentials(strCredentialsURL)
        rs.Timeout = ReportingServiceInterface.iTimeout
        rs.Url = ReportingServiceInterface.strReportingServiceURL
        rs.UnsafeAuthenticatedConnectionSharing = True

        Dim btBuffer As Byte() = Nothing

        Dim rsWarnings As Warning() = Nothing
        Try
            Dim fstrStream As System.IO.FileStream = System.IO.File.OpenRead(strFileNameAndPath)
            btBuffer = New Byte(fstrStream.Length - 1) {}
            fstrStream.Read(btBuffer, 0, CInt(fstrStream.Length))
            fstrStream.Close()
        Catch ex As System.IO.IOException
            Throw New Exception(ex.Message)
        End Try

        Try
            rsWarnings = rs.CreateReport(strReportName, strReportingPath, bOverwrite, btBuffer, Nothing)

            If Not (rsWarnings Is Nothing) Then
                Dim warning As Warning
                For Each warning In rsWarnings
                    Log(warning.Message)
                Next warning
            Else
                Log("Report: {0} created successfully with no warnings", strReportName)
            End If

        Catch ex As System.Web.Services.Protocols.SoapException
            Log(ex.Detail.InnerXml.ToString())
        Catch ex As Exception
            Log("Error at creating report. Invalid server name/timeout?" + vbCrLf + vbCrLf + "Error Description: " + vbCrLf + ex.Message)
            Console.ReadKey()
            System.Environment.Exit(1)
        End Try
    End Sub ' End Function CreateThisReport

Проблема возникает, когда вы выделяете байтовый массив, который по крайней мере на 1 байт больше, чем файл RDL (XML).

В частности, я использовал конвертер C # в vb.net, который преобразовал

  btBuffer = new byte[fstrStream.Length];

в

  btBuffer = New Byte(fstrStream.Length) {}

Но поскольку в C # число обозначает количество элементов в массиве, а в VB.NET это число обозначает UPPER BOUND массива, у меня был избыточный байт, вызывающий эту ошибку.

Таким образом, решение проблемы просто:

  btBuffer = New Byte(fstrStream.Length - 1) {}
3
ответ дан Stefan Steiger 23 August 2018 в 23:18
поделиться
Другие вопросы по тегам:

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