如何解决 jdoconfig.xml 中 xsi:noNamespaceSchemaLocation 的验证错误

13
自从我今天更新到GAE 1.7.2.1以后,在所有的jdoconfig.xml文件中,我都遇到了验证错误。 我有默认的jdoconfig.xml内容:
[...]
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
[...]

而 Eclipse 验证会抛出以下错误:

Referenced file contains errors (http://java.sun.com/xml/ns/jdo/jdoconfig).  
For more information, right click on the message in the Problems View and 
select "Show Details..."

当点击详情时,我可以看到一堆像这样的行:

s4s-elt-character: Non-whitespace characters are not allowed in schema elements
other than 'xs:appinfo' and 'xs:documentation'. Saw 'var_U = "undefined";'.

"Saw ..." 这段文字中的不同行和不同内容在每个我使用 Google 插件中"新建 Web 应用程序项目..." 时开始的项目中都会出现。

所以有人遇到这个问题吗?有解决方法吗?

8个回答

28

试一下这个:

<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd">

根据这里的回答 Validating jdoconfig with incorrect url

xmlns不是一个真正的文件/目录,更像是一个命名空间,因此不应该存在!版本被附加到获得真正的XSD文件,即 http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd


我之前也有类似的问题,不过那方法解决了。很抱歉这个方法对你没用。能否提供更多背景信息,介绍一下你在做什么,以及为什么会有 jdoconfig.xml 文件?你是使用SOAP客户端还是其他什么工具?在 1.7.2.1 版本之前这个功能正常工作吗(如果正常,请告知版本号)? - joncalhoun
我的错,我实际上没有做那件事。 - mamuso
3
这个解决方案容易被忽略的“技巧”在于,创建新的GAE Web应用程序项目时模式位置行的默认值为:xsi:noNamespaceSchemaLocation,而从xsi:noNamespaceSchemaLocationxsi:SchemaLocation 的更改,在我第一次查看时也被忽略了。我认为答案应该进行编辑以强调这种变化,并且就会更少引起错误的负面影响。 - Rex Remus
Rex Remus,你的评论很有帮助。我一直在复制xsd位置,但没有改变xsi:noNamespaceSchemaLocation为xsi:SchemaLocation,这仍然导致错误。将xsi:SchemaLocation与xsd路径更改后,问题得到解决。 - Lalit Rane

6
这里有几个问题。
语法问题在于你提供给 xsi:noNamespaceSchemaLocation 的URI被重定向到 http://www.oracle.com/technetwork/java/index.html 并返回一个HTML文档。你使用的XSD验证器试图解析失败。
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" 
          content="text/html; charset=utf-8" />
    <script type="text/javascript">
      var _U = "undefined";
      var g_HttpRelativeWebRoot = "/ocom/";
      var SSContributor = false;
...

作为一个XSD模式文档,由于某种原因,它试图解释出了什么问题,并专注于在未预期的地方找到字符串var_U =“undefined”,而不是字符数据。

接着存在一些概念上的问题。

  • 您的文档位于名为http://java.sun.com/xml/ns/jdo/jdoconfig的命名空间中。如果您想验证文档,则为什么要将模式验证器指向没有目标命名空间的模式(即noNamespaceSchemaLocation)?鉴于您的文档元素至少有一些是命名空间限定的,您将需要(正如joncalhoun已经建议的那样)使用xsi:schemaLocation并提供一对告诉验证器每个命名空间可以找到模式文档的位置。

  • 模式文档可能过去曾从位置http://java.sun.com/xml/ns/jdo/jdoconfig提供服务,但由于它显然是为您的词汇命名的标准命名空间,所以实际上这不太可能。大多数系统可以相当可靠地区分命名空间和模式文档,前者是抽象且定义不清晰的事物,而后者通常是为给定命名空间定义特定XSD模式组件的XML文档。将模式文档的URI用作命名空间的名称是不合法的,但却很少见。

请注意,joncalhoun提供的模式文档URL(http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd)实际上确实可以解析(重定向到http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/jdo/jdoconfig_3_0.xsd),并指定http://java.sun.com/xml/ns/jdo/jdoconfig作为其目标命名空间。(这意味着即使您通过将其URI作为xsi:noNamespaceSchemaLocation的值成功检索此模式文档,您仍然会收到错误,因为它不是元素和属性没有命名空间的模式文档。)

这让我想你应该再次阅读joncalhoun的答案,并仔细地再试一遍。如果在您尝试时它没有起作用,那么我的钱肯定是要么您尝试了类似于但并非完全与他建议相同的东西,要么它解决了这个问题,但是暴露了其他问题,这很容易误认为是失败。


非常全面和有教育意义。谢谢,当然,我的错是没有仔细阅读并尝试@joncalhoun的答案。 - mamuso
对问题的分析非常出色。请查看我的评论,以了解建议的编辑,这可能有助于澄清为什么有人可能不会“看到”他建议的更改。 - Rex Remus

4
一种解决方法是在Eclipse首选项中设置XML目录。
详细信息:
条目元素:URI
位置:http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd
URI:http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd
键类型:命名空间名称
键:http://java.sun.com/xml/ns/jdo/jdoconfig

0

我在这方面取得了成功:

Right Click Project -> Properties -> Validation -> XML Syntax
  1. 启用项目特定设置(如果需要)
  2. 在验证文件下,对于未指定语法,请选择“警告”
  3. 点击“确定”
  4. 如果要求验证文件,请单击“是”

您可以通过转到 Windows -> Preferences 来为所有项目执行相同的操作。

确保您正在验证文件(步骤4)。


0

这是我解决它的方法:

<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd">

0

C.M.提到的语法和概念问题是插件和Google设置的问题,两者都建议解决此问题。

xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig

我并没有特别使用jdo,但是我仍然在这个命名空间中遇到了验证错误。在最近之前,这个命名空间还是好的。

我使用了LuboM的方法,它对我起作用了。不过,既不是LuboM的方法,也不是joncalhoun的方法是答案,因为它会将我绑定到jdo 3.0。

Oracle将不得不提供修复程序。显然,他们的意图是解决跨版本的jdo命名空间问题。


0

你可以尝试以下路径来解决你的问题:

<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

0

我曾经遇到过同样的问题,只需将jdoconfig.xml文件从Eclipse的验证中排除即可。尽管您的Eclipse会为其抛出错误,但这并不影响正确部署项目到GAE。

以下是如何仅排除jdoconfig.xml文件以消除该烦人错误:

右键单击您的Eclipse项目->属性->验证->XML验证器,单击“...”按钮以获取更多选项。

您应该看到包括组和排除组选项。单击排除组->添加规则...->文件夹或文件名,并浏览到您的文件。

清理或重建您的项目。验证错误应该已经消失了。

这在Eclipse Luna中对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接