0

我以前从未使用过 XML。我正在尝试将单个 XML 文件发送到 SQL Server,在那里它(希望)能够被解构并插入到各种表中。

我正在构建测试。因此,每个测试有 X 个问题,每个问题有 X 个答案选项和 1 个正确答案的解释。以下 XML 示例是否有效?我错过了任何可以简化它的东西吗?

<test>
    <testid>1</testid>
    <qablock>
        <question>
            <question_number>1</question_number>
            <question_text>What is 1 + 1?</question_text>
        </question>
        <explanation>It's 2.</explanation>
        <options>
            <option>
                <option_number>1</option_number>
                <option_value>1</option_value>
                <is_correct>0</is_correct>
            </option>
            <option>
                <option_number>2</option_number>
                <option_value>2</option_value>
                <is_correct>1</is_correct>
            </option>
            <option>
                <option_number>3</option_number>
                <option_value>3</option_value>
                <is_correct>0</is_correct>
            </option>
            <option>
                <option_number>4</option_number>
                <option_value>4</option_value>
                <is_correct>0</is_correct>
            </option>
            <option>
                <option_number>5</option_number>
                <option_value>5</option_value>
                <is_correct>0</is_correct>
            </option>
        </options>
    </qablock>
    <qablock>
        <question>
            <question_number>2</question_number>
            <question_text>What is 2 + 2?</question_text>
        </question>
        <explanation>It's 4.</explanation>
        <options>
            <option>
                <option_number>1</option_number>
                <option_value>1</option_value>
                <is_correct>0</is_correct>
            </option>
            <option>
                <option_number>2</option_number>
                <option_value>2</option_value>
                <is_correct>0</is_correct>
            </option>
            <option>
                <option_number>3</option_number>
                <option_value>3</option_value>
                <is_correct>0</is_correct>
            </option>
            <option>
                <option_number>4</option_number>
                <option_value>4</option_value>
                <is_correct>1</is_correct>
            </option>
            <option>
                <option_number>5</option_number>
                <option_value>5</option_value>
                <is_correct>0</is_correct>
            </option>
        </options>
    </qablock>
</test>
4

2 回答 2

1

您所拥有的是完全有效的 XML。它没有关联的架构(即,您可以验证结构/确保您提供的 XML 文件在使用之前符合预期,这样您就不会得到意外的结果。

您可以添加一个 XML 标头 - 这会有所帮助,因为它会告诉解析器要使用什么字符集 - 还检查您是否使用您在标头中指定的编码保存 XML 文件(如果您需要对此进行更多解释,请告诉我)。

最后,尽管您所拥有的一切都很好,但我个人会稍微不同地编写 XML 以使其更小且更易于阅读。那里没有硬性规定,但一般来说,减小文件大小是好的,可读性也是好的。

最后,我可能会将其包装在测试元素中;这样,如果您想一次上传多个测试,这很容易做到(但如果您愿意,您仍然可以一次将其用于一个文件) - 同样没有硬性规定,但建立灵活性总是好的。

<?xml version="1.0" encoding="utf-8"?>
<tests>
    <test testid='1'>
        <qablock number='1'>
            <question>What is 1 + 1?</question>
            <explanation>It's 2.</explanation>
            <options>
                <option number='1' value='1' />
                <option number='2' value='2' correct='true' />
                <option number='3' value='3' />
                <option number='4' value='4' />
                <option number='5' value='5' />
            </options>
        </qablock>
        <qablock number='2'>
            <question>What is 2 + 2?</question>
            <explanation>It's 4.</explanation>
            <options>
                <option number='1' value='1' />
                <option number='2' value='2'/>
                <option number='3' value='3' />
                <option number='4' value='4' correct='true'  />
                <option number='5' value='5' />
            </options>
        </qablock>
    </test>
</tests>

希望有帮助。

- - - - - -编辑 - - - - - - - -

这是一个使用 SQL 的 xml 数据类型的示例;

declare @x xml

set @x = '<tests>
    <test testid=''1''>
        <qablock number=''1''>
            <question>What is 1 + 1?</question>
            <explanation>It''s 2.</explanation>
            <options>
                <option number=''1'' value=''1'' />
                <option number=''2'' value=''2'' correct=''true'' />
                <option number=''3'' value=''3'' />
                <option number=''4'' value=''4'' />
                <option number=''5'' value=''5'' />
            </options>
        </qablock>
        <qablock number=''2''>
            <question>What is 2 + 2?</question>
            <explanation>It''s 4.</explanation>
            <options>
                <option number=''1'' value=''1'' />
                <option number=''2'' value=''2''/>
                <option number=''3'' value=''3'' />
                <option number=''4'' value=''4'' correct=''true''  />
                <option number=''5'' value=''5'' />
            </options>
        </qablock>
    </test>
</tests>'

select @x.value('(/tests/test/qablock[@number=''2'']/question/text())[1]','nvarchar(max)') Question
, @x.value('(/tests/test/qablock[@number=''2'']/options/option[@correct=''true'']/@number)[1]','nvarchar(max)') Answer
于 2012-10-19T17:59:31.087 回答
1

有两种方法可以验证 XML

形成良好

这基本上与语法有关(您的 XML 格式正确,我对其进行了验证)。

来自维基百科

格式良好的 XML 尊重这些规则

  1. 它仅包含正确编码的合法 Unicode 字符。

  2. 除非执行它们的标记描述角色,否则不会出现诸如“<”和“&”之类的特殊语法字符。

  3. 分隔元素的开始、结束和空元素标记正确嵌套,没有丢失和重叠。
  4. 元素标签区分大小写;开始和结束标签必须完全匹配。标签名称不能包含任何字符 !"#$%&'()*+,/;<=>?@[]^`{|}~,也不能包含空格字符,并且不能以 -、. 或一个数字。

  5. 有一个包含所有其他元素的“根”元素。

您可以在此处在线验证您的 XML

有效的 XML

一个有效的 XML 是关于你的 XML 中的内容,它就像一个问题应该至少有 1 个解释。

为此,您需要一个DTD或一个模式,然后在线验证它

于 2012-10-19T18:00:01.063 回答