2011-11-21 4 views
4

와 XML 파일에서 xsd.exe 도구가있는 XSD 파일 생성 : 나는 기존의 XML 파일에 대한 XSD 파일을 생성하는 것을 시도하고있다내가 원하는 무엇 여러 네임 스페이스

합니다.

저는 Visual Studio와 함께 제공되는 xsd.exe 도구를 사용하고 있습니다.

XML 파일의 일부 요소는 네임 스페이스 한정입니다. 어떤 경우에는 지역 이름은 아래와 같이 동일합니다

<images> 
    <icons> 
    <icon url="http://www.icons.com/logo.png"/>  
    </icons> 
    <foo:icons> 
    <foo:foo_icon url="http://www.foo.org/pic.ico"/> 
    </foo:icons> 
</images> 

내가 점점 오전 :

xsd.exe myfile.xml를 호출하면 나에게 오류를 제공합니다 Cannot add a column named 'icons': a nested table with the same name already belongs to this DataTable.

OK하지만 네임 스페이스가 무엇 그게 아니야? 그런 모호한 문제 해결. 네임 스페이스가 없다면 접두어를 사용하는 대신 foo_icons 요소를 호출하면됩니다.

내가 뭘하려 : 나는 그것을 고려 네임 스페이스를 취 너무 xsd.exe을 구성하는 방법을 찾고 시도하지만, 어느 xsd /?도 내 구글 쿼리가 어떤 답을 밝혀

. /n[amespace]: 매개 변수는 여러 네임 스페이스를 지정할 수 없습니다.

나는 Working with Namespaces in XML Schema을 읽었지만 훨씬 더 현명하지는 않습니다.

별도의 XSD 파일을 만들어 서로에 포함시켜야합니까? 이 목적을 위해 xsd.exe을 사용하는 것은 다루지 않습니다.

저는 XSD에 익숙하지 않기 때문에 전체 프로세스에 대한 몇 가지 필수 개념을 오해하고 있습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 고맙겠습니다.

편집 1 - 마크 Gravell의 제안 다음은 :

나는 것을 시도했다, 그러나 나는 또한 xsd로 (다른 부모 노드 아래) XML의 다른 섹션에 나타난 (접두사) 요소의 이름을 변경 한 것 그것을 허용하지 마십시오. 나는 elementOne, elementTwo 등으로 이름을 바꿔야했습니다. 수동으로 다시 이름을 바꿀 예정이었습니다. 하지만 내가 가지고있는 XSD는 어쨌든 작동하지 않습니다.

<xs:schema id="NewDataSet" targetNamespace="http://www.foo.com/bar" xmlns:mstns="http://www.foo.com/bar" xmlns="http://www.foo.com/bar" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" 
xmlns:app1="http://www.foo.com/bar/extensions" 
xmlns:app2="http://www.w3.org/XML/1998/namespace"> 

그리고 내가 가진 파일의 유효성을 검사하기 위해 노력하고있어 때, 나는 오류를 받고 있어요 :

헤더는 목적이 무엇인지와,

Prefix 'app2' cannot be mapped to namespace name reserved for "xml" or "xmlns".

그래서 xsd.exe 이렇게 만들었습니까? 어떻게 수정해야합니까?

+0

xsd의 제한 사항처럼 보입니다. 얼마나 큰 XML입니까? 즉 손으로 현실적인 옵션을 사용하고 있습니까? 어쩌면 모호한 비트를 잘라내어 나중에 수동으로 추가 할 수 있습니다. 그리고 xsd.exe에서 대부분을 처리 할 수 ​​있는지 확인하십시오. (다음 마지막 몇 비트를 다시 추가 출력을 편집) –

답변

3

XML 스키마를 제공하기 위해 xsd.exe를 사용하는 방법은 실제로 DataSet을 사용하려고 시도합니다. . NET에서 그 사실은 매우 제한되어 있습니다.

다른 옵션을 사용할 수 있습니다.NET : here 문서화 된 .NET API를 사용하여 스크립트를 작성하십시오.

적어도 XML 조각의 경우 작동합니다. 그것을 시도하고 유효한 XmlSchemaSet을 만듭니다. 아래는 동일한 API를 사용하는 도구를 사용하여 실행 한 테스트입니다 (몇 가지 부가 기능과 호루라기가 있으면 손으로 약간의 수정을해야 함).

고정 XML (추가 foo는 접두어 누락 된 네임 스페이스 선언) :

<images> 
    <icons> 
     <icon url="http://www.icons.com/logo.png"/> 
    </icons> 
    <foo:icons xmlns:foo="urn:tempuri-org:test"> 
     <foo:foo_icon url="http://www.foo.org/pic.ico"/> 
    </foo:icons> 
</images> 

최상위 스키마 (어떤 대상 네임 스페이스, 이미지 요소와 일치하지 않음) :

<?xml version="1.0" encoding="utf-8"?> 
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)--> 
<xsd:schema xmlns:foo="urn:tempuri-org:test" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:import schemaLocation="XSDMultipleNamespaces1.xsd" namespace="urn:tempuri-org:test" /> 
    <xsd:element name="images"> 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:element name="icons"> 
     <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="icon"> 
      <xsd:complexType> 
       <xsd:attribute name="url" type="xsd:string" use="required" /> 
      </xsd:complexType> 
      </xsd:element> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:element ref="foo:icons" /> 
    </xsd:sequence> 
</xsd:complexType> 

foo 네임 스페이스 스키마 :

<?xml version="1.0" encoding="utf-8"?> 
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)--> 
<xsd:schema xmlns="urn:tempuri-org:test" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:tempuri-org:test" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="icons"> 
<xsd:complexType> 
    <xsd:sequence> 
    <xsd:element name="foo_icon"> 
     <xsd:complexType> 
     <xsd:attribute name="url" type="xsd:string" use="required" /> 
     </xsd:complexType> 
    </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

생성 된 XML 스키마 파일은 XML의 유효성을 검사 좋다.

+0

고마워. 글쎄, 실제로 전에'XmlSchemaInference' 클래스를 사용했습니다 - 참조 http://stackoverflow.com/questions/7311880/xmlschema-inferred-from-an-xml-file-how-to-iterate-through-all-the- elements-in/7324613 # 7324613 누군가 관심이 있다면. 나는 그것이'xsd.exe'보다 우월하다고 생각하지 않았습니다. 이 접근 방식을 시도하고 대답을 수락합니다. –

+0

실제로 작동했습니다! 건배. 나는 여기저기서 결과를 조정해야하지만,'xsd.exe'가 내뱉은 것보다 훨씬 더 깨끗합니다. 나는이 해결책을 추천한다. –