我正在按照此解决方案在我的字符串资源文件中使用enetities:
是否可以直接在Android资源XML文件中进行字符串替换?
我在资源树中使用外部文件:/res/raw/entities.dtd,其内容:
<!ENTITY ent_devicename "MyDeviceName">
Run Code Online (Sandbox Code Playgroud)
在string.xml资源文件中:
<!DOCTYPE resources [
<!ENTITY % ent_devicename SYSTEM "../raw/entities.dtd">
%ent_devicename;
]>
<resources>
<string name="name">The name is &ent_devicename;</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
实体"ent_devicename"已被引用,但未被声明.
如您所见,Android Studio可识别外部实体文件:
和实体:
有人能提供一个正确的例子来使事情有效吗?我的意思是一个完全可编译的Android Studio项目,在单独的文件中包含实体声明.
更新 好的,如果你更加关注这个w3schools链接:
https://www.w3schools.com/xml/xml_dtd_entities.asp
你看到了解决方案:
外部entities.dtd文件包含
<!ENTITY ent_devicename "MyDeviceName">
Run Code Online (Sandbox Code Playgroud)
那么新的字符串资源资源:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY ent_devicename SYSTEM "../raw/entities.dtd">
]>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="Typos">
<string name="ent_devicenamxxe2">&ent_devicename;</string>
Run Code Online (Sandbox Code Playgroud)
我改变了<!ENTITY % ent_devicename对<!ENTITY ent_devicename(不再%)我删除%ent_devicename;
现在它编译但是生成的APK似乎忽略了实体值(使用空字符串).所以问题没有解决!
让我知道!
xml dtd android-resources android-studio android-gradle-plugin
我需要能够引用命名的HTML实体,•而不是•XML文档中的Unicode替代.我可以控制XML文档的某些部分,例如定义DOCTYPE,但在实际的XML中进行查找和替换不是一种选择.我能得到这样一些元素 ,并&通过包括XHTML过渡DOCTYPE,但我需要更多的手动定义.我该怎么做呢?
- 编辑 -
感谢Jim的回答,这就是我最终的结果.这很好,因为我可以使用XHTML过渡实体,并添加我自己的:
<!DOCTYPE
html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[
<!ENTITY bull "•">
<!ENTITY ldquo "“">
<!ENTITY rdquo "”">
... etc ...
]
>
Run Code Online (Sandbox Code Playgroud) 我想在使用Scala解析xml文件时偶尔忽略dtd规范.我知道这可以通过java接口很容易地完成
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
dbf.setFeature("http://xml.org/sax/features/namespaces", false);
dbf.setFeature("http://xml.org/sax/features/validation", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何使用Scala的xml库轻松完成此操作.如果可能的话,我想继续使用scala xml库,因为它明显更好.
提前致谢!
我开始使用XML文件和解析器作为存储数据的便捷方式
我想使用DTD来检查xml文件到达时的结构.
这是我的DTD文件
< ?xml version="1.0" encoding="UTF-8"?>
< !ELEMENT document (level*)>
< !ELEMENT level (file,filelName?,fileNumber?)>
< !ELEMENT file (#PCDATA)>
< !ELEMENT filelName (#PCDATA)>
< !ELEMENT fileNumber (#PCDATA)>
Run Code Online (Sandbox Code Playgroud)
(请注意,fileName和fileNumber实际上是纯可选的)
和
<document>
<level>
<file>group1file01</file>
</level>
<level>
<file>group1file02</file>
<fileName>file 2</fileName>
<fileNumber>0</fileNumber>
</level>
...
Run Code Online (Sandbox Code Playgroud)
所以这一切都很好.(我现在使用eclipse"validate"选项来测试它)
然而,在测试时我得到了我认为是一个奇怪的错误
如果我做
<level>
<levelName>Level 2</levelName>
<levelNumber>0</levelNumber>
<file>group1level02</file>
</level>
Run Code Online (Sandbox Code Playgroud)
更改行的顺序,Eclipse拒绝验证它...
我想知道这是否是Eclipse的问题,或者订单是否真的很重要.
如果订单很重要,我怎样才能更改DTD以使其无论元素的排序如何都能正常工作?
我无法真正改变XML,因为我已经编写了所有的XML文件和解析器(我知道我的方法是错误的)
我是Scala的新手,所以我可能不在此基础上,我想知道问题是否是我的代码.鉴于Scala文件httpparse,简化为:
object Http {
import java.io.InputStream;
import java.net.URL;
def request(urlString:String): (Boolean, InputStream) =
try {
val url = new URL(urlString)
val body = url.openStream
(true, body)
}
catch {
case ex:Exception => (false, null)
}
}
object HTTPParse extends Application {
import scala.xml._;
import java.net._;
def fetchAndParseURL(URL:String) = {
val (true, body) = Http request(URL)
val xml = XML.load(body) // <-- Error happens here in .load() method
"True"
}
}
Run Code Online (Sandbox Code Playgroud)
运行哪个(URL无关紧要,这是一个笑话示例):
scala> HTTPParse.fetchAndParseURL("http://stackoverflow.com")
Run Code Online (Sandbox Code Playgroud)
结果总是:
java.io.IOException: Server returned HTTP response code: …Run Code Online (Sandbox Code Playgroud) 我有一个本地DTD文件test.dtd.内容是:
<!DOCTYPE coord [
<!ELEMENT coord (date)>
<!ELEMENT date (#PCDATA)>
]>
Run Code Online (Sandbox Code Playgroud)
我想使用xmllint验证XML.此XML中没有DOCTYPE:
<?xml version="1.0" encoding="x-mac-roman"?>
<coord>
<date>20150312</date>
</coord>
Run Code Online (Sandbox Code Playgroud)
如果我将DTD块作为第二行插入到我的XML文件的副本中并使用:
xmllint --valid --noout my2.xml
Run Code Online (Sandbox Code Playgroud)
但是当我尝试:
xmllint --loaddtd test.dtd --valid --noout my.xml
xmllint --dtdvalid test.dtd --noout my.xml
Run Code Online (Sandbox Code Playgroud)
两者都不起作用.结果是:
test.dtd:1: parser error : Content error in the external subset
<!DOCTYPE coord [
^
test.dtd:1: parser error : Content error in the external subset
<!DOCTYPE coord [
^
Could not parse DTD test.dtd
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?看来我的XML 必须包含一个DOCTYPE行(带有SYSTEM关键字)来引用我想要避免的外部DOCTYPE文件.请参阅:http://www.w3schools.com/dtd/
有没有修改XML的解决方案?
我在文件中得到了dtd,我无法将其删除.当我尝试用Java解析它时,我得到"引起:java.net.SocketException:网络无法访问:连接",因为它的远程dtd.我能以某种方式禁用dtd检查吗?
移动网站无法正确显示.即使我有正确的DTD,我也必须放大才能正确查看我的网站:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
"http://www.wapforum.org/DTD/xhtml-mobile12.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>MySite Mobile</title>
<link rel="stylesheet" type="text/css" href="mobile.css"/>
</head>
<body>
<!-- content -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我有正确的DTD吗?
该播客HOWTO苹果网站上显示了一个示例XML文件,该文件是指播客DTD: podcast-1.0.dtd.遗憾的是,此地址不提供DTD.我听说您可以使用feedvalidator.org验证Feed,但它只是一项服务.还有其他官方播客DTD可用的位置吗?
DTD给出为xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd".此URL实际上不会解析为DTD.
我有一个XSD(XML Schema),我需要转换为DTD.有没有免费的实用工具或简单的方法来实现这一目标?以XSLT为例?Python脚本也是受欢迎的.
注意:这是Free DTD到XSD转换实用程序问题的相反方向?
我知道转换可能会丢失信息......
我尝试过XMLSpy或oXygenXML,但它不是免费的,我没有定制转换的可能性.