【问题标题】:Is this XML format correct?这种 XML 格式是否正确?
【发布时间】:2023-04-10 00:06:01
【问题描述】:

我以前从未使用过 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>

【问题讨论】:

    标签: xml


    【解决方案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
    

    【讨论】:

    • ps。我考虑将正确的标志移动到选项元素而不是反对正确的选项并让它保持正确的选项ID - 这样你就可以为每个问题强制执行一个正确的答案 - 但如果有可能存在不止一个权利回答它更好,因为它再次提供了灵活性。
    • 哇,谢谢!因此,我们不会上传或使用实际的 XML“文件”本身。我将构建一个大的 XML 字符串,它将作为 varchar(max) 变量传递给 sql server。那么,在这种情况下,标题是否仍然适用?
    • 如果没有文件,可能不需要。仅供参考:SQL 有一个您可能感兴趣的 XML 数据类型 - 这允许您在 SQL 查询中使用 XML。这是上面的 MSDN:msdn.microsoft.com/en-us/library/ms189887(v=sql.105).aspx。如果您需要更多信息/帮助,请告诉我。
    • 是的,这就是我今天一整天的工作。手指交叉。再次感谢。你是人间的神。 :)
    • 如何用一些 SQL 代码发布一个大型的后续问题?
    【解决方案2】:

    有两种方法可以验证 XML

    结构良好

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

    来自wikipedia

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

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

    2. 没有出现“

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

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

    您可以在线验证您的 XML here

    有效的 XML

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

    为此,您需要DTDschema,然后在线验证

    【讨论】:

    • 感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多