我已经实现了在应用程序初始化时使用XmlTextWriter创建下面的XML文件.
并且知道我不知道如何使用XmlDocument和XmlNode更新childNode id值.
是否有一些属性来更新id值?我试过InnerText但是失败了.谢谢.
<?xml version="1.0" encoding="UTF-8"?>
<Equipment xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<License licenseId="" licensePath=""/>
<DataCollections>
<GroupAIDs>
<AID id="100">
<Variable id="200"/>
<Variable id="201"/>
</AID>
<AID id="">
<Variable id="205"/>
</AID>
<AID id="102"/>
</GroupAIDs>
<GroupBIDs>
<BID id="2000">
<AID id="100"/>
</BID>
<BID id="2001">
<AID id="101"/>
<AID id="102"/>
</BID>
</GroupBIDs>
<GroupCIDs>
<BID id="8"/>
<BID id="9"/>
<BID id="10"/>
</GroupCIDs>
</DataCollections>
</Equipment>
Run Code Online (Sandbox Code Playgroud) 我知道没有直接的方法,但仍然..我们可以将XElement元素转换为XmlNode.类似的选项InnerText,并InnerXml有 XmlNode具体的.
所以,如果我想使用这些选项,可以做什么来转换 XElement成XmlNode反之亦然.
目的:我计划使用XmlTextWriter创建XML文件,并使用XmlNode SelectSingleNode(),node.ChildNode [?]修改/更新一些现有内容.InnerText = someting等.
用XmlTextWriter创建XML文件后,如下所示.
XmlTextWriter textWriter = new XmlTextWriter("D:\\learning\\cs\\myTest.xml", System.Text.Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)
我练习下面的代码.但未能保存我的XML文件.
XmlDocument doc = new XmlDocument();
doc.Load("D:\\learning\\cs\\myTest.xml");
XmlNode root = doc.DocumentElement;
XmlNode myNode;
myNode= root.SelectSingleNode("descendant::books");
Run Code Online (Sandbox Code Playgroud)
....
textWriter.Close();
doc.Save("D:\\learning\\cs\\myTest.xml");
Run Code Online (Sandbox Code Playgroud)
我发现按照我的方式生产是不好的.有什么建议吗?我不清楚同一个项目中XmlTextWriter和XmlNode的概念和用法.感谢您阅读和回复.
这必须是一个如此简单的问题,但我无法得到答案.
我有一个XmlNode,我想要做的就是输出这个节点,作为一个字符串,缩进(制表符或空格)完整,以提供更好的可读性.
到目前为止,我尝试了XmlWriter,XmlTextWriter,XmlDocument,XmlReader.
将XmlNode输出为字符串WITHOUT缩进很容易.我只是做XmlNode.OuterXml.我如何在那里得到缩进?
我想这样做而不通过XmlNode循环并使用强力来添加空格,因为我认为应该有一个更简单的方法.
谢谢.
编辑:对于未来的读者,这里是答案:
var xmlNode = is some object of type XmlNode
using (var sw = new StringWriter())
{
using (var xw = new XmlTextWriter(sw))
{
xw.Formatting = Formatting.Indented;
xw.Indentation = 2; //default is 1. I used 2 to make the indents larger.
xmlNode.WriteTo(xw);
}
return sw.ToString(); //The node, as a string, with indents!
}
Run Code Online (Sandbox Code Playgroud)
我需要这样做的原因是输出节点的xml语法高亮.我使用AvalonEdit突出显示xml,将突出显示的文本输出到html,然后将html转换为可以在RichTextBox中显示的FlowDocument.
我有一个看起来像这样的xml:
{ <xml><ep><source type="xml">...</source><source type="text">..</source></ep></xml>}
Run Code Online (Sandbox Code Playgroud)
在这里,我想检索"源类型"的值,其中类型s属性.
我试过这样,但它不起作用:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document dDoc = builder.parse("D:/workspace1/ereader/src/main/webapp/configurations/config.xml");
System.out.println(dDoc);
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate("//xml/source/@type/text()", dDoc, XPathConstants.NODE);
System.out.println(node);
} catch (Exception e) {
e.printStackTrace();
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader("config.xml"));
Document doc = builder.parse(is);
NodeList nodeList = doc.getElementsByTagName("source");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.hasAttributes()) { …Run Code Online (Sandbox Code Playgroud) 我有Node一个Document.我想把Node它转换成新的根节点Document.
我能想到的唯一方法如下:
Node node = someChildNodeFromDifferentDocument;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document newDocument = builder.newDocument();
newDocument.importNode(node);
newDocument.appendChild(node);
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我觉得这是相当恼人的冗长.我没有看到更简洁/更直接的方式,还是我必须这样做?
我有以下场景:我有一个XML文档,例如像这样
<someRootElement>
<tag1>
<tag2
someKey=someValue
someKey2=someValue2
/>
<tag3/>
<tag4
newKey=newValue
newKey2=newValue2
/>
</tag1>
</someRootElement>
Run Code Online (Sandbox Code Playgroud)
现在我希望在不丢失子节点的情况下将父tag1调用为reallyCoolTag.我尝试了以下内容,但不幸的是它不能按照我的意愿工作(但我知道为什么,b/c它缺少了一些东西,我猜):
// the new element:
Element neu = doc.createElement( newValue );
// append it to the root:
root.appendChild( neu );
// get all the child nodes:
NamedNodeMap nnm = nodes.item(i).getAttributes();
for( int dg = 0; dg < nnm.getLength(); dg++ ){
neu.setAttribute( nnm.item( dg ).getNodeName(),
nnm.item( dg ).getNodeValue() );
}
//---------------------------------------------------------
// HERE I GUESS I AM MISSING THE PART WHERE THE CHILD …Run Code Online (Sandbox Code Playgroud) 我想在存在无法识别的命名空间时加载XmlNode而不会获得XmlException.
原因是我需要将XMLNode实例传递给方法.我正在加载具有其原始上下文中的命名空间的任意XML片段(例如,MSWord格式化和其他具有各种模式的软件产品,这些模式使用其名称空间前缀"污染"内容).命名空间对我或它传递的目标方法并不重要.(这是因为目标方法使用它作为HTML进行渲染,名称空间将被自然地忽略或抑制.)
示例
以下是我尝试创建XMLNode的示例片段:
<p>
<div>
<st1:country-region w:st="on">
<st1:place w:st="on">Canada</st1:place>
</st1:country-region>
<hr />
<img src="xxy.jpg" />
</div>
</p>
Run Code Online (Sandbox Code Playgroud)
当我尝试将其加载到XmlDocument实例(这是我尝试获取XmlNode)时,我得到以下XML异常:
'st1'是未声明的命名空间.第3行,第251位.
如何从这种XML片段中获取XmlNode实例?
xmlnode ×10
xml ×9
c# ×5
java ×3
.net ×1
count ×1
domdocument ×1
indentation ×1
linq ×1
string ×1
xelement ×1
xmldocument ×1
xslt ×1