- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我当前的代码是这样打印出 xml 的:
<type xmlns="http://www.example.com">
<OBJECT_TYPE xmlns="">x3000</OBJECT_TYPE>
- <prop xmlns="">
<DESCRIPTION>a very fast train</DESCRIPTION>
<PARENT>NULL</PARENT>
<VIRTUAL>0</VIRTUAL>
<VISIBLE>1</VISIBLE>
<PICTURE>NULL</PICTURE>
<HELP>NULL</HELP>
<MIN_NO>NULL</MIN_NO>
<MAX_NO>NULL</MAX_NO>
<NAME_FORMAT>NULL</NAME_FORMAT>
</prop>
</type>
但我想要这个输出:
<type xmlns="http://www.example.com">
<OBJECT_TYPE>x3000</OBJECT_TYPE>
- <prop>
<DESCRIPTION>a very fast train</DESCRIPTION>
<PARENT>NULL</PARENT>
<VIRTUAL>0</VIRTUAL>
<VISIBLE>1</VISIBLE>
<PICTURE>NULL</PICTURE>
<HELP>NULL</HELP>
<MIN_NO>NULL</MIN_NO>
<MAX_NO>NULL</MAX_NO>
<NAME_FORMAT>NULL</NAME_FORMAT>
</prop>
</type>
怎么做?这是我当前的代码:
public void saveXmlToFile(Type objType, Properties property)
throws IOException, ParserConfigurationException, SAXException,
JDOMException {
File xmlFile = new File(XMLEditorService.getXMLEditorService()
.getFile());
org.jdom2.Document doc = new SAXBuilder().build(xmlFile);
Element root = doc.getRootElement();
Namespace ns = Namespace.getNamespace("http://www.example.com");
Element type = new Element("type");
Element prop = new Element("prop");
// Add <type> as a child of <root>
root.addContent(type);
// Set namespace on <type>
type.setNamespace(ns);
type.addContent(new Element("OBJECT_TYPE").setText(objType.getObjectType()));
// Turn off namespace on <prop>
prop.setNamespace(Namespace.NO_NAMESPACE);
// Add <prop> as a child of <type>
type.addContent(prop);
prop.addContent(new Element("DESCRIPTION").setText(property.getDescription()));
prop.addContent(new Element("PARENT").setText(property.getParent()));
prop.addContent(new Element("VIRTUAL").setText(property.getVirtual()));
prop.addContent(new Element("VISIBLE").setText(property.getVisible()));
prop.addContent(new Element("PICTURE").setText(property.getPicture()));
prop.addContent(new Element("HELP").setText(property.getHelp()));
prop.addContent(new Element("MIN_NO").setText(property.getMin_no()));
prop.addContent(new Element("MAX_NO").setText(property.getMax_no()));
prop.addContent(new Element("NAME_FORMAT").setText(property.getName_format()));
XMLOutputter xmlOutput = new XMLOutputter(Format.getPrettyFormat());
// Create a new file and write XML to it
xmlOutput.output(doc, new FileOutputStream(new File(XMLEditorService.getXMLEditorService().getFile())));
System.out.println("Wrote to file");
}
最佳答案
在 XML 文档中,如果您将 xmlns="http://a.b.c"
添加到一个元素,那么该元素及其所有后代元素将位于命名空间 "http://a.b.c"
,除非后代元素碰巧改变了xmlns
声明。这意味着,在 XML 文档中,默认 namespace “级联”到后代。这个过程很“方便”,因此 XML 不会那么“困惑”。 “默认”命名空间是没有前缀的命名空间。将默认命名空间设置为某个值 "http://a.b.c"
的父元素的子元素位于该命名空间中,即使它们没有 xmlns="http://a.b.c"
在他们的标签行上声明。
当 JDOM 像这样对文档建模时,它会将每个元素节点的 namespace 设置为它应该的确切值。它不会“计算”或“级联”元素的 namespace 。在 JDOM 中,如果您更改父元素的 namespace ,它也不会更改子元素的 namespace 。因此,例如,如果您有:
<root xmlns="http://a.b.c">
<child />
</root>
然后您在默认命名空间 "http://a.b.c"
中同时拥有 root
和 child
。该文档可以在 JDOM 中创建为:
Namesapce ns = Namespace.get("http://a.b.c");
Element root = new Element("root", ns);
Element child = new Element("child", ns);
root.addConent(child);
请注意 ns 是如何添加到两个元素中的。正如预期的那样,这个 JDOM 的输出是:
<root xmlns="http://a.b.c">
<child />
</root>
现在,如果您更改根的命名空间:
Namesapce ns = Namespace.get("http://a.b.c");
Element root = new Element("root", ns);
Element child = new Element("child", ns);
root.addConent(child);
root.setNamespace(Namespace.NO_NAMESPACE);
你会得到:
<root>
<child xmlns="http://a.b.c"/>
</root>
但是,更有趣的是,如果您离开根命名空间,并更改子命名空间,
Namesapce ns = Namespace.get("http://a.b.c");
Element root = new Element("root", ns);
Element child = new Element("child", ns);
root.addConent(child);
child.setNamespace(Namespace.NO_NAMESPACE);
你得到:
<root xmlns="http://a.b.c">
<child xmlns="" />
</root>
当你创建一个没有命名空间参数的 JDOM 元素时 new Element("tag")
而不是 new Element("tag", Namespace)
然后 JDOM 会自动把NO_NAMESPACE 命名空间中的新元素(与 new Element("tag", Namespace.NO_NAMESPACE);
相同)。这就是您正在做的。
因此,JDOM 正在执行您要求它执行的操作...但是您要求它执行的操作似乎并不是您想要的。
你说你想要的是:
<type xmlns="http://www.example.com">
<OBJECT_TYPE>x3000</OBJECT_TYPE>
- <prop>
<DESCRIPTION>a very fast train</DESCRIPTION>
<PARENT>NULL</PARENT>
<VIRTUAL>0</VIRTUAL>
<VISIBLE>1</VISIBLE>
<PICTURE>NULL</PICTURE>
<HELP>NULL</HELP>
<MIN_NO>NULL</MIN_NO>
<MAX_NO>NULL</MAX_NO>
<NAME_FORMAT>NULL</NAME_FORMAT>
</prop>
</type>
上述 XML 在命名空间 Namespace.getNamespace("http://www.example.com")
中包含一切。
您的代码将很多东西放入 NO_NAMESPACE 命名空间。您的代码可能看起来像这样(注意我添加到 new Element(...)
的所有 , ns
)...
请参阅 Element(String) 的 JavaDoc , 以及 Element(String, Namespace); .
org.jdom2.Document doc = new SAXBuilder().build(xmlFile);
Element root = doc.getRootElement();
Namespace ns = Namespace.getNamespace("http://www.example.com");
Element type = new Element("type", ns);
Element prop = new Element("prop", ns);
// Add <type> as a child of <root>
root.addContent(type);
// Set namespace on <type>
// type.setNamespace(ns); NO NEED, done on new Element("type", ns); above
type.addContent(new Element("OBJECT_TYPE", ns).setText(objType.getObjectType()));
// Turn off namespace on <prop>
// NO!!!! You want to keep the namespace ON!!!
// prop.setNamespace(Namespace.NO_NAMESPACE);
// Add <prop> as a child of <type>
type.addContent(prop);
prop.addContent(new Element("DESCRIPTION", ns).setText(property.getDescription()));
prop.addContent(new Element("PARENT", ns).setText(property.getParent()));
prop.addContent(new Element("VIRTUAL", ns).setText(property.getVirtual()));
prop.addContent(new Element("VISIBLE", ns).setText(property.getVisible()));
prop.addContent(new Element("PICTURE", ns).setText(property.getPicture()));
prop.addContent(new Element("HELP", ns).setText(property.getHelp()));
prop.addContent(new Element("MIN_NO", ns).setText(property.getMin_no()));
prop.addContent(new Element("MAX_NO", ns).setText(property.getMax_no()));
prop.addContent(new Element("NAME_FORMAT", ns).setText(property.getName_format()));
XMLOutputter xmlOutput = new XMLOutputter(Format.getPrettyFormat());
// Create a new file and write XML to it
xmlOutput.output(doc, new FileOutputStream(new File(XMLEditorService.getXMLEditorService().getFile())));
System.out.println("Wrote to file");
在上面的代码中,所有内容都在"http://www.example.com"
命名空间中,因此,JDOM 只需要输出带有 xmlns
声明的顶级元素,您应该得到您想要的。
无论如何,您不能将这种混淆归咎于 JDOM……命名空间的本质就是它的复杂性。
关于java - namespace 和 JDOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21778987/
我正在使用 Netbeans IDe 7.0.1。我正在用 Java 测试一个程序,该程序使用 ROME 来解析 xml。 public class RSSNew { public
我对 xml 中的元素列表有疑问 我正在尝试删除下面的所有内容以及标签。 但是当我调试参数列表时,我注意到我的列表如下所示: text element text element text elemen
我尝试将内容变量转换为文档: (Document)document 并收到“无法从内容转换到文档”。还尝试过: new Document(document)) 但是得到:“构造函数 Document(
我目前正在努力使用 JDom 注释现有行,最好我想注释整个节点。 SAXBuilder jdomBuild = new SAXBuilder(); jdomDoc = jdomBuil
我计划从 JSP 中的 xml 文件读取配置文件数据。 现在我可以读取它并将重要信息存储在单个 session 变量中,或者只是将 xml 文件中的整个部分放入 jdom 文档中并将其放入单个 ses
是否可以将 XSD 模式解析为 JDOM 树? 或者是否有任何其他库(需要文档;))可以完成此任务? 谢谢 极端编码器 最佳答案 XSD 是 XML,因此您当然可以将其解析为 JDOM 并按照您的意愿
我在 xml 中创建了一个数据库,我想在 Jframe 中创建一个注册表单以将对象添加到数据库中。因此,我构建了代码,但每次单击 Registra 按钮时,它都会覆盖该文件。如何保留文件并仅添加元素而
我正在尝试读取 XML 我的 XML 文件是 我的源代码: public class XMLReader { public static void
Java:如何使用JAVA-JDOM获取节点的属性名称?例如, 输出应该是: id 我的Java程序:在______中需要获取源文件中节点的属性名称。该程序只是将“_Test”添加到 x
我一直在尝试在我的 java 项目中进行导入,但我不断收到以下错误。 The import org.jdom cannot be resolved 我在我的项目下创建了一个 lib 文件夹,并将 ht
假设我有一些 xml: blablatesthellodfhsdfsd 现在我需要获取字符串的内容,所以我会 blablatesthellodfhsdfsd 我已经在脑子里琢磨了一段时间了,但我似乎还
我无法从根元素中删除元素。下面是xml的例子
这是我使用 java 的第一天,我尝试为我的网站构建一个小的 xml 解析器,这样我就可以清楚地查看我的 sitemaps.xml 。我使用的代码是这样的 import java.io.IOExcep
我是 JDOM 的新手,在创建文档时遇到了问题。问题是我想要能够添加不具有“xmlns”属性的元素。我正在使用 JDOM 1.1 我找到的所有示例都显示了没有“xmlns”的输出。这是一个简单的代码片
我在从 String 读取数据时遇到问题。该字符串看起来像 xml 文件: something something
我有一个应用程序使用 XmlUnit 从两个 XML 文件中获取差异。但问题是 XmlUnit 使用 JDOM。我的 xml 文件有 ~1GB 大! 将那些 xml 存储在 JDOM 文档中需要太多的
我有一个如下所示的 XML: This value must be bigger than the other. 使用JDOM,我可以获得以下文本结构: Document d = new
我正在尝试使用 JDOM 解析 xml。问题是我想将一个巨大的 xml 文件拆分成更小的文件。巨大的 xml 包含许多 .我要对待每一个作为一个页面。我找不到可以从 复制所有内容的函数, 到不同的
我下面有一个 xml,我正在使用 JDOM 2.0.5 解析它 trueMetro_C&C 现在,在尝试使用 node.getValue() 获取标签的值(其中节点的类型为 Eleme
我有一个方法可以解析特定的字符串,并且应该使用 JDOM 的 setText() 方法更改该字符串。但是当我在程序完成后查看文档时,字符串从未改变: public void findVirtue(St
我是一名优秀的程序员,十分优秀!