GVKun编程网logo

通过PHP在XML文件中添加新节点(php如何创建xml文件)

25

本文将介绍通过PHP在XML文件中添加新节点的详细情况,特别是关于php如何创建xml文件的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于c#–如何

本文将介绍通过PHP在XML文件中添加新节点的详细情况,特别是关于php如何创建xml文件的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于c# – 如何使用Linq to XML将XML保存在XML文件中?、dom4j解析xml文件,添加新节点,添加节点内容,读取文件中节点内容作为新增节点内容、Domj4读取XML文件--实现获取XML文件中所有的标签节点、duilib中添加自定义控件之后怎么能够在xml文件中配置使用的知识。

本文目录一览:

通过PHP在XML文件中添加新节点(php如何创建xml文件)

通过PHP在XML文件中添加新节点(php如何创建xml文件)

我只是想问一个问题..如何使用PHP在xml中插入一个新节点.我的XML文件(questions.xml)如下所示

<?xml version="1.0" encoding="UTF-8"?>
<Quiz>
   <topic text="Preparation for Exam">
      <subtopic text="Science" />
      <subtopic text="Maths" />
      <subtopic text="english" />
   </topic>
</Quiz>

我想添加一个带有“text”属性的新“subtopic”,即“geography”.我怎么能用PHP做到这一点?提前谢谢.
我的代码是

<?PHP

$xmldoc = new DOMDocument();
$xmldoc->load('questions.xml');



$root = $xmldoc->firstChild;

$newElement = $xmldoc->createElement('subtopic');
$root->appendChild($newElement);

// $newText = $xmldoc-> createTextNode(‘geology’);
   // $newElement-> appendChild($newText);

$xmldoc->save('questions.xml');

?&GT

解决方法:

我会用SimpleXML.它看起来像这样:

// Open and parse the XML file
$xml = simplexml_load_file("questions.xml");
// Create a child in the first topic node
$child = $xml->topic[0]->addChild("subtopic");
// Add the text attribute
$child->addAttribute("text", "geography");

您可以使用echo显示新的XML代码,也可以将其存储在文件中.

// display the new XML code
echo $xml->asXML();
// Store new XML code in questions.xml
$xml->asXML("questions.xml");

c# – 如何使用Linq to XML将XML保存在XML文件中?

c# – 如何使用Linq to XML将XML保存在XML文件中?

我正在尝试使用 Linq to XML来保存&在 XML文件和 Windows窗体应用程序之间检索一些HTML.当它将其保存到XML文件时,HTML标记将获得xml编码,并且不会保存为直接HTML.

示例HTML:

<P><FONT color=#004080><U>Sample HTML</U></FONT></P>

保存在XML文件中:

&lt;P&gt;&lt;FONT color=#004080&gt;&lt;U&gt;Sample HTML&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;

当我手动编辑XML文件并输入所需的HTML时,Linq会拉入HTML并正确显示它.

以下是将HTML保存到XML文件的代码:

XElement currentReport = (from item in callReports.Descendants("callReport")
                                  where (int)item.Element("localId") == myCallreports.LocalId
                                  select item).FirstOrDefault();

        currentReport.Element("studio").Value = myCallreports.Studio;
        currentReport.Element("visitDate").Value = myCallreports.Visitdate.ToShortDateString();
       // *** The next two XElements store the HTML
        currentReport.Element("recomendations").Value = myCallreports.Comments;
        currentReport.Element("reactions").Value = myCallreports.Ownerreaction;

我假设这是发生了xml编码的b / c,但我不知道如何处理它. This question给了我一些线索……但没有答案(对我而言,至少).

谢谢您的帮助,

奥兰

解决方法

设置Value属性将自动编码html字符串.这应该可以解决问题,但您需要确保HTML是有效的XML(XHTML).
currentReport.Element("recomendations").ReplaceNodes(XElement.Parse(myCallreports.Comments));

编辑:您可能需要将用户输入的HTML包装在< div>中< / DIV>标签. XElement.Parse期望找到至少包含起始和结束xml标记的字符串.所以,这可能会更好:

currentReport.Element("recomendations").ReplaceNodes(XElement.Parse("<div>" + myCallreports.Comments + "</div>"));

然后你只需要确保像< br>这样的标签.正在< br />中发送.

编辑2:另一个选项是使用XML CDATA.用<![CDATA [和]]>包装HTML,但我从来没有实际使用过,我不确定它是如何影响读取xml的.

currentReport.Element("recomendations").ReplaceNodes(XElement.Parse("<![CDATA[" + myCallreports.Comments + "]]>"));

dom4j解析xml文件,添加新节点,添加节点内容,读取文件中节点内容作为新增节点内容

dom4j解析xml文件,添加新节点,添加节点内容,读取文件中节点内容作为新增节点内容

package org.dom4j.io;


import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;


import org.dom4j.Document;
import org.dom4j.Element;
import org.jaxen.function.SubstringBeforeFunction;


public class InsertNodeSwh {


    private static String path = "F:\\项目是SVN\\40_源码";


    public static void main(String[] args) {
        Element element = null;
        try {
            File folder = new File(path);
            //list()获取目录下所有文件 
            //list()获取目录下所有文件及目录的绝对路径
            //使用增强for遍历目录下文件(批量处理xml文件)
            for (File f : folder.listFiles()) {
                System.out.println("获取文件:" + f);


                //创建SAXReader,调用起read方法解析xml文件
                SAXReader reader = new SAXReader();


                //读取文件,获取document对象
                Document document = reader.read(f);


                //获取根节点
                element = document.getRootElement();
                System.out.println("根节点:" + element);


                //获取XMLNode节点,截取需要的节点内容
                String sElement1 = element.element("Property")
                        .element("XMLNode").getText();
                System.out.println("ss1获取节点的内容:" + sElement1);
                String ss1 = sElement1.substring(0, sElement1.indexOf("\\"));
                System.out.println("ss1截取的内容:" + ss1);


                System.out.println("**************************");


                String sElement2 = element.element("Property")
                        .element("stdTableName").getText();
                System.out.println("sElement获取节点的内容:" + sElement2);


                System.out
                        .println("===================================================================================================");


                //给根节点添加Property节点
                Element brandElement = element.addElement("Property");
                //给Property节点添加子节点
                Element typeElement1 = brandElement.addElement("Name");
                typeElement1.setText("定期期限");//添加节点内容
                Element typeElement2 = brandElement.addElement("Level");
                typeElement2.setText("1");
                Element typeElement3 = brandElement.addElement("IsKey");
                typeElement3.setText("0");
                Element typeElement4 = brandElement.addElement("Key");
                //typeElement4.setText("");
                Element typeElement5 = brandElement.addElement("stdTableName");
                typeElement5.setText(sElement2);
                Element typeElement6 = brandElement.addElement("stdFieldName");
                typeElement6.setText("N_DQQX");
                Element typeElement7 = brandElement.addElement("stdType");
                typeElement7.setText("Int");
                Element typeElement8 = brandElement.addElement("stdLength");
                //typeElement8.setText("");
                Element typeElement9 = brandElement.addElement("XMLNode");
                typeElement9.setText(ss1 + "定期期限");
                Element typeElement10 = brandElement.addElement("DefaultValue");
                //typeElement10.setText("");
                Element typeElement11 = brandElement
                        .addElement("TranslateType");
                //typeElement11.setText("");
                Element typeElement12 = brandElement
                        .addElement("TranslateCondition");
                //typeElement12.setText("");
                Element typeElement13 = brandElement.addElement("PreCondition");
                //typeElement13.setText("");


                try {
                    Writer osWrite = new OutputStreamWriter(
                            new FileOutputStream(f));//创建输出流  
                    OutputFormat format = OutputFormat.createPrettyPrint(); //获取输出的指定格式    
                    format.setEncoding("UTF-8");//设置编码 ,确保解析的xml为UTF-8格式  
                    XMLWriter writer = new XMLWriter(osWrite, format);//XMLWriter 指定输出文件以及格式    
                    writer.write(document);//把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)    
                    writer.flush();
                    writer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
        }
    }
}

 

Domj4读取XML文件--实现获取XML文件中所有的标签节点

Domj4读取XML文件--实现获取XML文件中所有的标签节点

Domj4读取XML文件--实现获取XML文件中所有的标签节点

contact.xml

<?xml version="1.0" encoding="GBK"?> <contactList> <contact id="001"> <name>张三</name> <age>20</age> <phone>1234567</phone> <email>1234</email> <qq>222</qq> </contact> <contact id="002"> <name>lisi</name> <age>20</age> <phone>1234567</phone> <email>1234</email> <qq>222</qq> </contact> </contactList>


Demo2.java

实现获取XML文件contact.xml中的所有节点

package gz.itcast.a_dom4j_read;

import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

/*
 * 第二个dome4j读取XML文件内容的例子
 * 节点
 * 标签
 * 属性
 * 文本
 */
public class Demo2 {
	/*
	 * 得到节点信息
	 * 
	 */
	@Test
	public void test1() throws Exception{
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/contact.xml"));
		//nodeIterator:得到当前节点下的所有子节点对象(不包含孙节点以下的节点)
		Iterator<Node> it = doc.nodeIterator();
		while(it.hasNext()){
			Node node = it.next();//取出元素
			
			String name = node.getName();//得到结点名称
			System.out.println(name);
			//继续取出其下面的子节点
			//自由标签节点才有子节点
			//判断当前节点是否是标签节点
			if(node instanceof Element){
				Element elem = (Element)node;
				Iterator<Node> it2 = elem.nodeIterator();
				while(it2.hasNext()){
					Node n2 = it2.next();
					System.out.println(n2.getName());
				}
			}
		}
	}
	
	/*
	 * 遍历XML文档的所有节点
	 */
	@Test
	public void test2() throws Exception{
		//读取XML文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/contact.xml"));
		
		//得到根标签
		Element rooElem = doc.getRootElement();
		getChildNodes(rooElem);
	}
	/*
	 * 获取传入的标签下的所有子节点
	 */
	private void getChildNodes(Element elem) {
		System.out.println(elem.getName());
		
		//得到子节点
		Iterator<Node> it = elem.nodeIterator();
		while(it.hasNext()){
			Node node = it.next();
			//判断是否是标签节点
			if(node instanceof Element){
				Element el = (Element)node;
				//递归取下面的所有节点
				getChildNodes(el);
			}
		}
	}
}

duilib中添加自定义控件之后怎么能够在xml文件中配置使用

duilib中添加自定义控件之后怎么能够在xml文件中配置使用

添加自定义控件可能有两种不同的情况:

1、 在duilib库中添加的自定义控件。

2、 在我们的应用程序中自己重写了一个控件。

下面开始讲解不同的情况下怎么才能支持在xml文件配置控件:

1、 库中情况

假如自定义的控件是CGifUI类。

库中情况相对是比较简单的,只需在分析xml文件时候将控件创建出来就行了,所以我找到的函数是CControlUI* CDialogBuilder::_Parse(cmarkupNode* pRoot,CControlUI* pParent,175)">CPaintManagerUI* pManager)。这个函数中添加如下的代码:

SIZE_T cchLen = _tcslen(pstrClass);

switch( cchLen ) {

case 3:

if (_tcscmp(pstrClass,DUI_CTR_GIF) == 0) pControl = new CGifUI;

// 下面这个宏定义就是xml中配置的配置项对应

#defineDUI_CTR_GIF (_T("Gif"))

2、 库外情况

假如自定义控件是CTransportTaskLayout

库外的情况,可能就麻烦一些了。首先我们在加载xml文件的时候要调用下面的函数:

CControlUI* Create(STRINGorID xml,

LPCTSTR type = NULL,

IDialogBuilderCallback* pCallback = NULL,

CPaintManagerUI* pManager = CControlUI* pParent = NULL);

在这个函数中和此处有关的参数就是IDialogBuilderCallback* pCallback。

首先要明确一点是这个控件是在duilib中不能被接受的,所以只能在外宅里养着了。至于怎么养让我下面给你细细的说来。虽然说家里面是不接受的,但是我们自己必须接受这个事实,所以我们必须想办法解决这个问题,那就会从上面的那个参数开始着手了,我看CDialogBuilder::_Parse这个函数可以知道,如果在原有的duilib库中不接受这种控件类型,会一直到函数的后面调用pControl = m_pCallback->CreateControl(pstrClass);

,这里就给我们给外宅转正的机会了,所以我们自己会可以重写一个IDialogBuilderCallback类,然后重写类里的CreateControl函数,创建我们自己新控件了。下面给出在项目中用到的代码:

class CTransportTaskBuilderCallBack : public IDialogBuilderCallback

{

public:

CTransportTaskBuilderCallBack(){};

virtual CControlUI* CreateControl(LPCTSTR pstrClass)

{

if (_tcscmp(pstrClass,21)">"TransportTaskLayout")) == 0)

{

CTransportTaskLayout * pLayout = (CTransportTaskLayout*)g_TransportListUICenter->CreateLayoutInstance("TransportTaskLayout"));

return pLayout;

}

return NULL;

}

};

上面这个类就是如果在xml文件中发现了"TransportTaskLayout"字符串,就会创建CTransportTaskLayout类的对象。

到这里外宅已经被转正了。现实生活中就没有这么美的事了,要转正是会出人命的。

关于通过PHP在XML文件中添加新节点php如何创建xml文件的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c# – 如何使用Linq to XML将XML保存在XML文件中?、dom4j解析xml文件,添加新节点,添加节点内容,读取文件中节点内容作为新增节点内容、Domj4读取XML文件--实现获取XML文件中所有的标签节点、duilib中添加自定义控件之后怎么能够在xml文件中配置使用的相关信息,请在本站寻找。

本文标签: