为XDocument指定默认名称空间会给出空值(Specifiying a default namespace for XDocument gives empty value)
当我尝试从文本中解析XDocument时,我可以像这样获得默认名称空间:
var xmlDocument1 = XDocument.Parse("<root xmlns='http://somenamespace'></root>"); var xmlNamespace1 = xmlDocument1.Root.GetDefaultNamespace().NamespaceName; // somenamespace
但是,如果我尝试手动创建XDocument,则会得到一个空值:
var xmlRoot2 = new XElement(XName.Get("root", "http://somenamespace")); var xmlDocument2 = new XDocument(xmlRoot2); var xmlNamespace2 = xmlDocument2.Root.GetDefaultNamespace().NamespaceName; // is empty
我期望xmlNamespace2是“ http:// somenamespace ”。 有什么我做错了吗?
编辑︰建议重复中的答案不解决我的问题,即使我使用此处建议的函数︰ 如何设置XDocument的默认XML名称空间我仍然会得到空的名称空间。 以下是链接问题的解决方案:
class Program { static void Main(string[] args) { var xmlRoot = new XElement(XName.Get("root")); var xmlDocument = new XDocument(xmlRoot); SetDefaultXmlNamespace(xmlRoot, "http://somenamespace"); var xmlNamespace = xmlDocument.Root.GetDefaultNamespace().NamespaceName; // is empty } public static void SetDefaultXmlNamespace(XElement xelem, XNamespace xmlns) { if (xelem.Name.NamespaceName == string.Empty) xelem.Name = xmlns + xelem.Name.LocalName; foreach (var e in xelem.Elements()) SetDefaultXmlNamespace(e, xmlns); } }
默认名称空间仍然是空的。
When I try to parse XDocument from text, I can get the default namespace like this:
var xmlDocument1 = XDocument.Parse("<root xmlns='http://somenamespace'></root>"); var xmlNamespace1 = xmlDocument1.Root.GetDefaultNamespace().NamespaceName; // somenamespace
However, if I try to create XDocument manually, I'm getting an empty value:
var xmlRoot2 = new XElement(XName.Get("root", "http://somenamespace")); var xmlDocument2 = new XDocument(xmlRoot2); var xmlNamespace2 = xmlDocument2.Root.GetDefaultNamespace().NamespaceName; // is empty
I expect xmlNamespace2 to be "http://somenamespace". Is there anything I'm doing wrong?
Edit: The answer in suggested duplicate doesn't solve my problem, even if I use the function suggested here: How to set the default XML namespace for an XDocument I will still get the empty namespace. Here is the solution from the linked question:
class Program { static void Main(string[] args) { var xmlRoot = new XElement(XName.Get("root")); var xmlDocument = new XDocument(xmlRoot); SetDefaultXmlNamespace(xmlRoot, "http://somenamespace"); var xmlNamespace = xmlDocument.Root.GetDefaultNamespace().NamespaceName; // is empty } public static void SetDefaultXmlNamespace(XElement xelem, XNamespace xmlns) { if (xelem.Name.NamespaceName == string.Empty) xelem.Name = xmlns + xelem.Name.LocalName; foreach (var e in xelem.Elements()) SetDefaultXmlNamespace(e, xmlns); } }
The default namespace is still empty.
原文:https://stackoverflow.com/questions/30489117
最满意答案
我认为你在正确的轨道上。 这是我过去所做的:
public class CassandraDAO { private Cluster cluster; private Session session; private String NODE = ABCServiceTester.Properties.Settings.Default.CASSANDRA_NODE; private String USER = ABCServiceTester.Properties.Settings.Default.USERNAME; private String PASS = ABCServiceTester.Properties.Settings.Default.PASSWORD; public CassandraDAO() { connect(); } private void connect() { cluster = Cluster.Builder().WithCredentials(USER, PASS) .AddContactPoint(NODE).Build(); session = cluster.Connect(); } protected Session getSession() { if (session == null) { connect(); } return session; } }
通过将我的连接细节隔离在我的CassandraDAO类中,然后为每个键空间或功能区域编写单独的DAO。 这些DAO继承了CassandraDAO类。
public class ProductsDAO : CassandraDAO { public List<Product> getProducts(string _itemID) { string strCQL = "SELECT priceAvail, productGroup, productSpec, sizeProfile " + "FROM products.itemsmaster " + "WHERE itemID=?"; Session localSession = getSession(); PreparedStatement statement = localSession.Prepare(strCQL); BoundStatement boundStatement = new BoundStatement(statement); boundStatement.Bind(_itemID); //get result set from Cassandra RowSet results = localSession.Execute(boundStatement); List<Product> returnVal = new List<Product>(); foreach (Row row in results.GetRows()) { Product tempProd = new Product(); tempProd.itemID= _itemID; tempProd.priceAvail = row.GetValue<int>("priceavail"); tempProd.productGroup = row.GetValue<string>("productgroup"); tempProd.productSpec = row.GetValue<string>("productspec"); tempProd.sizeProfile = row.GetValue<string>("sizeprofile"); returnVal.Add(tempProd); } return returnVal; }
C#中没有很多官方的DataStax代码。 我根据我在DataStax Academy上学习Cassandra Java Development类所学到的内容进行了调整。 显然,在这个例子中我没有做MVC,但我希望它有帮助。
I think you're on the right track. Here is what I've done in the past:
public class CassandraDAO { private Cluster cluster; private Session session; private String NODE = ABCServiceTester.Properties.Settings.Default.CASSANDRA_NODE; private String USER = ABCServiceTester.Properties.Settings.Default.USERNAME; private String PASS = ABCServiceTester.Properties.Settings.Default.PASSWORD; public CassandraDAO() { connect(); } private void connect() { cluster = Cluster.Builder().WithCredentials(USER, PASS) .AddContactPoint(NODE).Build(); session = cluster.Connect(); } protected Session getSession() { if (session == null) { connect(); } return session; } }
With my connection details isolated in my CassandraDAO class, I then write individual DAOs for each keyspace or area of functionality. These DAOs then inherit the CassandraDAO class.
public class ProductsDAO : CassandraDAO { public List<Product> getProducts(string _itemID) { string strCQL = "SELECT priceAvail, productGroup, productSpec, sizeProfile " + "FROM products.itemsmaster " + "WHERE itemID=?"; Session localSession = getSession(); PreparedStatement statement = localSession.Prepare(strCQL); BoundStatement boundStatement = new BoundStatement(statement); boundStatement.Bind(_itemID); //get result set from Cassandra RowSet results = localSession.Execute(boundStatement); List<Product> returnVal = new List<Product>(); foreach (Row row in results.GetRows()) { Product tempProd = new Product(); tempProd.itemID= _itemID; tempProd.priceAvail = row.GetValue<int>("priceavail"); tempProd.productGroup = row.GetValue<string>("productgroup"); tempProd.productSpec = row.GetValue<string>("productspec"); tempProd.sizeProfile = row.GetValue<string>("sizeprofile"); returnVal.Add(tempProd); } return returnVal; }
There isn't a whole lot of official DataStax code out there for C#. I adapted this from what I learned by taking the Cassandra Java Development class on DataStax Academy. Obviously, I wasn't doing MVC in this example, but I hope it helps.
相关问答
更多-
使用以下代码: SparkConf confForCassandra = new SparkConf().setAppName("ConnectToCassandra") .setMaster("local[*]") .set("spark.cassandra.connection.host", "
"); CassandraConnector connector = CassandraConnector.appl ... -
下列中不属于面向对象的编程语言的是?[2022-05-30]
a -
使用IP地址配置Web API,例如本地192.168.xx 并用该IP替换localhost var data = await client.GetAsync("http://191.268.x.x:7074/api/values/get"); Config your Web API with an IP Address, say local 192.168.x.x And replace localhost by that IP var data = await client.GetAsync("ht ...
-
共享的Cassandra会话失去连接,必须重新启动应用程序(Shared Cassandra Session loses connection and app must be restarted)[2023-07-21]
您不需要创建新会话。 假设您使用的是datastax python-driver ,则驱动程序会维护一个“控制连接”,用于订阅节点向上/向下事件。 如果控制连接丢失,它将重新连接到群集中的另一台主机。 打开调试日志记录会很有用,这将揭示集群中节点被标记为低的原因。 You should not need to create a new session. Assuming you are using the datastax python-driver, the driver maintains a 'con ... -
我想,Web应用程序可以使用此访问令牌进行授权,但我现在不知道如何在asp.net核心中设置中间件。 ASP.NET Core中没有任何内容可以帮助您实现“资源所有者密码凭据授权”客户端。 幸运的是,您可以使用HttpClient轻松完成。 这是你如何做到这一点(注意错误处理留作练习): public async Task
SignIn(string username, string password) { if (string.IsNullOrEmpty(userna ... -
我认为你在正确的轨道上。 这是我过去所做的: public class CassandraDAO { private Cluster cluster; private Session session; private String NODE = ABCServiceTester.Properties.Settings.Default.CASSANDRA_NODE; private String USER = ABCServiceTester.Properties.Settin ...
-
我建议您使用Cassandra的DataStax Node.js驱动程序 ,它具有连接池和透明故障转移功能,您只需要执行查询,它将为您处理其余的问题。 var cassandra = require('cassandra-driver'); var client = new cassandra.Client({ contactPoints: ['host1', 'host2'], keyspace: 'ks1' }); var query = 'SELECT email, last_name FR ...
-
保存到spark中的cassandra,并行方法在java中无法使用(Save to cassandra in spark, parallelize method is not availble in java)[2023-09-22]
要parallelize java.util.List您可以使用JavaSparkContext (而不是SparkContext ),如下所示: import org.apache.spark.api.java.JavaSparkContext; JavaSparkContext sc = new JavaSparkContext(spark.sparkContext()); sc.parallelize(people); To parallelize java.util.List you can u ... -
您没有先设置与Cassandra的连接。 您需要先执行此操作,然后才能对其执行查询。 You didn't setup the connection to Cassandra first. You need to do this before you can execute queries against it.
-
cassandra与游戏框架(cassandra with play framework)[2022-10-06]
没有什么可以阻止你使用Cassandra和Play,就像你可以在Jetty或Tomcat或任何其他前端使用它一样。 Play提供了一些工具来抽象流行关系数据库的使用,但这些工具并不是Play的核心,因此您不必使用它们。 您将需要创建您的DAL以使用您选择的库(Hector,Astyanax等)与Cassandra交谈,然后像在任何其他应用程序中一样使用该DAL。 也许你正在尝试做一些与众不同的事情? 如果是这样,请具体说明您需要了解的内容。 此外,Play2与第一个版本完全不同,因此您需要重新访问您在旧版P ...