문제

일반 파일 업로드 컨트롤을 통해 ASP.NET 페이지에 업로드되는 XML 파일이 있습니다. 그것이 일어나면, 나는 XML을 검증하고 실조화하려고 시도하고 있습니다. 그러나 아래 코드는 다음과 같이 XSD를 참조하는 XML 파일을 검증하는 데 매우 편리합니다.

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

그러나이 XML 파일을 업로드하면 XML 파일 만 업로드됩니다. localschemapath.xsd는 존재하지 않으므로 유효성을 검사할 수 없습니다.

XSD를 로컬로 저장하더라도 XML 파일이 다음과 같은 스키마 위치로 작성 될 수 있기 때문에 여전히 옳지 않습니다.

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

또는 xsi : schemalocation = "someurl localschemapath.xsd"또는 xsi : schemalocation = "sodoneurl .................. localschemapath.xsd".

양도 논법!

(이 질문의 목적 상, 아래 코드를 꼬집어주었습니다. C#에서 참조 된 XSD에 대해 XML 검증)

using System.Xml;
using System.Xml.Schema;
using System.IO;

public class ValidXSD
{
    public static void Main()
    {
        // Set the validation settings.
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

        // Create the XmlReader object.
        XmlReader reader = XmlReader.Create("inlineSchema.xml", settings);

        // Parse the file. 
        while (reader.Read()) ;
    }

    // Display any warnings or errors.
    private static void ValidationCallBack(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
        else
            Console.WriteLine("\tValidation error: " + args.Message);
    }
}
도움이 되었습니까?

해결책

다음은 로컬 스키마로 XML을 검증하는 데 사용하는 코드 덩어리입니다.

string errors = string.Empty;

try
{
    XmlSchemaSet schemas = new XmlSchemaSet();
    schemas.Add(string.Empty, Page.MapPath("~/xml/Schema.xsd"));
    XmlDocument doc = new XmlDocument();
    doc.Schemas = schemas;
    doc.Load(Page.MapPath("~/xml/sampleXML.xml"));
    //use this line instead of the one above for a string in memory.
    //doc.InnerXml = xmlToValidate;  
    ValidationEventHandler validator = delegate(object send, ValidationEventArgs ve)
                                           {
                                               errors += "\n" + ve.Severity + ": " + ve.Message;
                                           };

    doc.Validate(validator);
}
catch (XmlException xe)
{
    errors += "\n" + xe.Message;
}
catch (XmlSchemaValidationException xe)
{
    errors += "\n" + xe.Message;
}

다른 팁

나는 당신이 일반적인 유효성 검사를 시도하고 있는지 여부를 알 수 없습니다.

그것이 후자라면 인터넷에서 스키마를 공개하고 사람들에게 URI를 참조하도록 지시하십시오.

전자라면 다음을 제안합니다.

  • 먼저 사용자가 XML 파일을 업로드합니다.
  • 스키마 참조를 위해 XML 파일을 구문 분석하십시오. 그들에게 "참조 yourSchema.xsd 발견되었다; 새 업로드 상자와 함께이 파일을 아래에 업로드하십시오.
  • 그런 다음 업로드 된 스키마에 대해 파일을 검증하십시오. 이렇게하려면 수정하십시오 Schemas 당신의 재산 settings 개체, 수정하는 대신 ValidationFlags 재산.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top