Program Tip

xml.LoadData-루트 수준의 데이터가 잘못되었습니다.

programtip 2020. 11. 19. 21:54
반응형

xml.LoadData-루트 수준의 데이터가 잘못되었습니다. 라인 1, 위치 1


WiX 설치 프로그램 내에서 일부 XML을 구문 분석하려고합니다. XML은 웹 서버에서 반환 된 모든 오류의 객체입니다. 이 코드로 질문 제목에 오류가 발생합니다.

XmlDocument xml = new XmlDocument();
try
{
    xml.LoadXml(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}

myString이것은 (의 출력에서 ​​볼 수 있듯이 text.txt)

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

text.txt 다음과 같이 나옵니다.

<?xml version="1.0" encoding="utf-8"?>
<Errors></Errors>

Data at the root level is invalid. Line 1, position 1.

오류가 있는지 확인할 수 있도록이 XML을 구문 분석해야합니다.

편집하다

이 질문은 표시된대로 중복되지 않습니다. 이 질문에서 질문을 한 사람 LoadXml은 XML 파일을 구문 분석하는 데 사용 했습니다. 올바른 사용 인 문자열을 구문 분석하고 있습니다.LoadXml


숨겨진 캐릭터는 아마도 BOM 일 것입니다. 문제에 대한 설명과 해결책은 여기 에서 찾을 수 있습니다. 여기 에서 James Brankin의 답변을 바탕으로 James Schubert에게 크레딧을 제공 합니다 .

이전 답변은 숨겨진 문자를 제거하지만 첫 번째 줄 전체도 제거합니다. 더 정확한 버전은 다음과 같습니다.

string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (xml.StartsWith(_byteOrderMarkUtf8))
{
    xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
}

Azure Blob에서 XSLT 파일을 가져와 XslCompiledTransform 개체에로드 할 때이 문제가 발생했습니다. 내 컴퓨터에서 파일은 괜찮아 보였지만 blob으로 업로드하고 다시 가져온 후 BOM 문자가 추가되었습니다.


Load()대신 방법을 사용 하면 문제가 해결됩니다. 더보기


여기서 문제는 myString헤더 라인이 있다는 것입니다. 첫 번째 줄의 시작 부분에 숨겨진 문자가 있거나 줄 자체로 인해 오류가 발생했습니다. 다음과 같이 첫 번째 줄을 잘라 냈습니다.

xml.LoadXml(myString.Substring(myString.IndexOf(Environment.NewLine)));

이것은 내 문제를 해결했습니다.


문제는 인코딩 문제라고 생각합니다. 그래서 첫 번째 줄 (인코딩 바이트 포함)을 제거하면 문제가 해결 될 수 있습니다.

루트 수준의 데이터 솔루션 이 잘못되었습니다. 라인 1, 위치 1 이 다음 XDocument.Parse(xmlString)으로 대체되었습니다.XDocument.Load( new MemoryStream( xmlContentInBytes ) );

내 xml 문자열이 괜찮아 보였습니다.

<?xml version="1.0" encoding="utf-8"?>

그러나 다른 텍스트 편집기 인코딩에서는 다음과 같이 보입니다.

?<?xml version="1.0" encoding="utf-8"?>

결국 나는 xml 문자열이 필요하지 않았지만 xml byte []. 문자열을 사용해야하는 경우 문자열에서 "보이지 않는"바이트를 찾고 인코딩을 사용하여 구문 분석 또는로드를 위해 xml 내용을 조정해야합니다.

도움이되기를 바랍니다.


바이트 배열을 직접 편집하여이 문제를 해결했습니다. UTF8 프리앰블을 수집하고 헤더를 직접 제거합니다. 나중에 GetString 메서드를 사용하여 byte []를 문자열로 변환 할 수 있습니다. 아래를 참조하십시오. 예방 조치로 \ r 및 \ t도 제거했습니다.

XmlDocument configurationXML = new XmlDocument();
List<byte> byteArray = new List<byte>(webRequest.downloadHandler.data);

foreach(byte singleByte in Encoding.UTF8.GetPreamble())
{
     byteArray.RemoveAt(byteArray.IndexOf(singleByte));
}
string xml = System.Text.Encoding.UTF8.GetString(byteArray.ToArray());
       xml = xml.Replace("\\r", "");
       xml = xml.Replace("\\t", "");

다른 인코딩으로 파일을 저장하십시오.

파일> 다른 이름으로 파일 저장 ...> 서명없이 UTF-8로 저장.

In VS 2017 you find encoding as a dropdown next to Save button.


If your xml is in a string use the following to remove any byte order mark:

        xml = new Regex("\\<\\?xml.*\\?>").Replace(xml, "");

I have found out one of the solutions. For your code this could be as follows -

XmlDocument xml = new XmlDocument();
try
{
    // assuming the location of the file is in the current directory 
    // assuming the file name be loadData.xml
    string myString = "./loadData.xml";
    xml.Load(myString);
}
catch (Exception ex)
{
    System.IO.File.WriteAllText(@"C:\text.txt", myString + "\r\n\r\n" + ex.Message);
    throw ex;
}

참고URL : https://stackoverflow.com/questions/17795167/xml-loaddata-data-at-the-root-level-is-invalid-line-1-position-1

반응형